Union-Find算法并确定边是否属于图中的循环

时间:2013-07-06 14:35:10

标签: graph cycle depth-first-search union-find

我正在读一本关于算法的书(“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问题有关吗?

1 个答案:

答案 0 :(得分:1)

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

反向链接是从后代指向父级的边缘,您应该知道在使用DFS算法遍历图形时构建林,而父级是在遍历中稍后标记完成的节点。 / p>

我给了你一些指向哪里可以看看,请告诉我这是否有助于你澄清你的问题。