我有以下问题。我在图中有两个不相交的顶点集,我想知道这两个集之间是否存在路径。
我只需知道存在这样的路径。
我已经在某处读过这可以使用union-find数据结构来解决,但我找不到适合我需要的算法
感谢任何帮助。
答案 0 :(得分:1)
使用Union-Find data structure可以有效地解决问题。
由A
和B
表示两组顶点,并初始化Union-Find数据结构,使图形的每个顶点v
属于它自己的集合。
让a1
成为A
的任意顶点。对UNION(FIND(a1), FIND(a))
中的每个顶点a
执行A
(除了a1
之外的所有顶点都将成为该集合的代表)。然后对B
中的顶点执行相同的操作:让b1
成为B
的任意顶点,并为UNION(FIND(b1), FIND(b))
的每个顶点b
执行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。 Inverse Ackerman函数增长非常缓慢,是每个UNION或FIND操作的运行时间的上限。