我正在读一本关于算法的书(“C ++中的数据结构和算法”),并且遇到了以下练习:
实施例。 20.修改
cycleDetectionDFS()
,以便确定特定边是否是无向图中循环的一部分。
在关于图表的章节中,本书内容为:
让我们从上一节回顾深度优先搜索 保证生成一个生成树,其中没有
edges
的元素 由depthFirstSearch()
使用导致与edges
的其他元素的循环。 这是因为如果顶点 v 和 u 属于edges
, 那么 edge(vu)被depthFirstSearch()
忽略了。一个问题 当depthFirstSearch()
被修改以便它可以检测时出现 特定边缘(vu)是否属于循环的一部分(参见练习20)。 是否应将这种修改的深度优先搜索应用于每个边缘 单独地,然后总运行将是O(E(E + V)),其可以转向 到密集图的O(V ^ 4)。因此,需要一种更好的方法 找到。任务是确定两个顶点是否在同一组中。二 需要操作来实现此任务:查找设置 如果顶点 v 属于顶点 v ,则将两个集合为一个 其中一个和 w 到另一个。这被称为 union-find 问题
稍后,作者描述了如何将两个集合并为一个,以防传递给函数union(edge e)
的边连接不同集合中的顶点。
但是,我仍然不知道如何快速检查边缘是否是循环的一部分。有人能给我一个粗略的解释,这个算法与前面提到的union-find问题有关吗?
答案 0 :(得分:1)
一个粗略的解释可能是检查一个链接是否是一个反向链接,每当你有一个反向链接你有一个循环,并且每当你有一个循环你有一个反向链接(对于有向和无向图形都是如此)。
反向链接是从后代指向父级的边缘,您应该知道在使用DFS算法遍历图形时构建林,而父级是在遍历中稍后标记完成的节点。 / p>
我给了你一些指向哪里可以看看,请告诉我这是否有助于你澄清你的问题。