Graph 联合查找算法及判定边是否属于图中的圈
我正在读一本关于算法的书(“C++中的数据结构和算法”),并遇到了以下练习: 例20。修改Graph 联合查找算法及判定边是否属于图中的圈,graph,cycle,depth-first-search,union-find,Graph,Cycle,Depth First Search,Union Find,我正在读一本关于算法的书(“C++中的数据结构和算法”),并遇到了以下练习: 例20。修改cycleDetectionDFS(),以便它可以确定特定边是否是无向图中循环的一部分 在关于图表的章节中,本书内容如下: 让我们回顾一下前一节中的深度优先搜索 保证生成一个生成树,其中没有边的元素 由depthFirstSearch()使用会导致与边的其他元素循环。 这是因为如果顶点v和u属于边, 然后,depthFirstSearch()忽略了边缘(vu)。问题 当修改depthFirstSearch(
cycleDetectionDFS()
,以便它可以确定特定边是否是无向图中循环的一部分
在关于图表的章节中,本书内容如下:
让我们回顾一下前一节中的深度优先搜索
保证生成一个生成树,其中没有边的元素
由depthFirstSearch()
使用会导致与边的其他元素循环。
这是因为如果顶点v和u属于边
,
然后,depthFirstSearch()
忽略了边缘(vu)。问题
当修改depthFirstSearch()
以使其能够检测时发生
特定边缘(vu)是否为周期的一部分(参见练习20)。
这种修改后的深度优先搜索是否应应用于每条边
另外,总的运行时间是O(E(E+V)),这可能会导致
对于稠密图,转化为O(V^4)。因此,需要一种更好的方法
找到了
任务是确定两个顶点是否在同一集中。两个
要实现此任务,需要执行以下操作:查找要设置的集合
顶点v属于,如果顶点v属于,则将两个集合合并为一个集合
对其中一个,对另一个。这就是所谓的联合发现
问题
稍后,作者将介绍如何将两个集合合并为一个集合,以防传递给函数union(edge e)
的边连接不同集合中的顶点
但是,我仍然不知道如何快速检查边是否是循环的一部分。有人能给我一个与前面提到的联合查找问题相关的算法的粗略解释吗?粗略解释可以是检查一个链接是否是反向链接,当你有反向链接时,你就有一个循环,当你有循环时,你就有一个反向链接(对于有向图和无向图都是这样)
反向链接是指从子代指向父代的边,您应该知道,当使用DFS算法遍历图形时,您构建了一个林,父代是一个节点,该节点在稍后的遍历中标记为finished
我给了你一些建议去哪里找,让我知道这是否有助于你澄清你的问题