2

我正在阅读一本关于算法的书(“C++ 中的数据结构和算法”)并且遇到了以下练习:

前任。20. 修改cycleDetectionDFS(),以便它可以确定特定边是否是无向图中循环的一部分。

在关于图表的章节中,书中写道:

让我们回顾一下前面的部分,深度优先搜索保证生成一棵生成树,其中没有edges 使用的元素depthFirstSearch()导致与其他元素的循环edges。这是因为如果顶点vu属于edges,那么边(vu)会被 忽略depthFirstSearch()。修改时会出现问题,depthFirstSearch()以便它可以检测特定边(vu)是否是循环的一部分(参见练习 20)。如果将这种修改后的深度优先搜索分别应用于每条边,那么总运行将是 O(E(E+V)),对于密集图,这可能变成 O(V^4)。因此,需要找到更好的方法。

任务是确定两个顶点是否在同一个集合中。实现此任务需要两个操作:找到顶点 v 所属的集合,如果顶点v属于其中一个集合,而w属于另一个集合,则将两个集合合并为一个集合。这被称为并集问题

稍后,作者描述了如何将两个集合合并为一个,以防传递给函数的边union(edge e)连接不同集合中的顶点。

但是,我仍然不知道如何快速检查边缘是否是循环的一部分。有人可以给我一个与上述联合查找问题相关的算法的粗略解释吗?

4

1 回答 1

1

一个粗略的解释可能是检查一个链接是否是一个反向链接,只要你有一个反向链接,你就有一个循环,只要你有一个循环,你就有一个反向链接(对于有向图和无向图都是如此)。

反向链接是从后代指向父节点的边,您应该知道,当使用 DFS 算法遍历图时,您会构建一个森林,而父节点是在遍历后期标记为完成的节点。

我给了你一些关于在哪里看的指示,让我知道这是否有助于你澄清你的问题。

于 2013-07-07T14:26:50.853 回答