【发布时间】:2017-08-10 19:29:41
【问题描述】:
我有以下问题。我在图中有两组不相交的顶点,我想知道这两组之间是否存在路径。
我只需要知道这样的路径存在。
我在某处读到,这可以使用 union-find 数据结构解决,但我找不到适合我需要的算法
不胜感激。
【问题讨论】:
我有以下问题。我在图中有两组不相交的顶点,我想知道这两组之间是否存在路径。
我只需要知道这样的路径存在。
我在某处读到,这可以使用 union-find 数据结构解决,但我找不到适合我需要的算法
不胜感激。
【问题讨论】:
使用Union-Find data structure 可以有效地解决问题。
用A和B表示这两组顶点,并初始化一个Union-Find数据结构,使得图的每个顶点v都属于自己的集合。
让a1 成为A 的任意顶点。对A 中的每个顶点a 执行UNION(FIND(a1), FIND(a))(除了a1,它将成为集合的代表)。然后对B 中的顶点执行相同操作:让b1 成为B 的任意顶点并对B 的每个顶点b 执行UNION(FIND(b1), FIND(b))。
现在FIND(a1) 准确返回属于A 的顶点集合,FIND(b1) 准确返回属于B 的集合顶点。特别是,如果A 和B 相互交叉,则FIND(a1)=FIND(b1)。对于图中的每条边(u,v),执行UNION(FIND(u), FIND(v))。
A 和B 之间存在路径当且仅当在上述过程中您已将a1 集合与b1 集合合并。
您已完成的 UNION/FIND 操作数最多为O(|E|+|A|+|B|)。因此,算法的运行时间是O(alpha(n)*(|E|+|A|+|B|)),其中alpha(n) 是Inverse Ackerman function。增长非常缓慢的逆阿克曼函数是每个 UNION 或 FIND 操作的运行时间的上限。
【讨论】: