我正在阅读一本关于算法的书(“C++ 中的数据结构和算法”)并且遇到了以下练习:
前任。20. 修改
cycleDetectionDFS()
,以便它可以确定特定边是否是无向图中循环的一部分。
在关于图表的章节中,书中写道:
让我们回顾一下前面的部分,深度优先搜索保证生成一棵生成树,其中没有
edges
使用的元素depthFirstSearch()
导致与其他元素的循环edges
。这是因为如果顶点v和u属于edges
,那么边(vu)会被 忽略depthFirstSearch()
。修改时会出现问题,depthFirstSearch()
以便它可以检测特定边(vu)是否是循环的一部分(参见练习 20)。如果将这种修改后的深度优先搜索分别应用于每条边,那么总运行将是 O(E(E+V)),对于密集图,这可能变成 O(V^4)。因此,需要找到更好的方法。任务是确定两个顶点是否在同一个集合中。实现此任务需要两个操作:找到顶点 v 所属的集合,如果顶点v属于其中一个集合,而w属于另一个集合,则将两个集合合并为一个集合。这被称为并集问题。
稍后,作者描述了如何将两个集合合并为一个,以防传递给函数的边union(edge e)
连接不同集合中的顶点。
但是,我仍然不知道如何快速检查边缘是否是循环的一部分。有人可以给我一个与上述联合查找问题相关的算法的粗略解释吗?