找到属于简单循环的所有顶点

时间:2013-07-05 10:03:12

标签: algorithm graph cycle depth-first-search

有没有办法在线性时间内找到图中简单循环一部分的所有顶点?

我在O(| V |(| V | + | E |))时间找到了一种方法,但是想知道是否有办法更快地完成它?

4 个答案:

答案 0 :(得分:7)

您要做的是删除所有Bridges(即删除时断开组件的边缘)。维基百科文章提供了一种线性时间算法,用于查找所有桥梁。

一旦所有桥都消失,每个节点要么被隔离(具有0度),要么是循环的一部分。抛弃孤独的节点,剩下的就是你想要的节点。

答案 1 :(得分:2)

使用DFS(深度优先搜索),您可以在O(| V | + | E |)时间内完成。实现DFS时,只要您发现子节点与父节点相同(意味着循环完成),就可以保留您用其父节点跟踪的旋转记录,您可以声明从该父节点到最后一个子节点的所有节点作为一些简单循环的一部分。

如果您需要更多解释,请在下面进行评论。

答案 2 :(得分:0)

我喜欢Bhavya的答案:但如果我详细说明它会有所帮助。

通常,如果您执行DFS,则您拥有一个访问数组,该数组包含访问/未访问状态。

现在有

int visited[N];//N is the number of nodes/vertices in graph

visited[i] =-1 if i-th vertex is not yet visited
visited[i] = 0 if i-th vertex is being processed
visited[i] = 1 if processing of i-th vertex is done

这样一来,如果你遇到一个带有访问值0的dfs的顶点,就意味着你有一个循环。要在循环中找到顶点,请使用一个前驱数组来存储路径中的前一个顶点。

答案 3 :(得分:0)

好的,我想我有答案。 在处理DFS时,对于每个顶点v计算低(v)(下面解释)。然后再次运行DFS并检查每个顶点v:

  

如果低(v)!= d(v)(其中d(v)是距离DFS树根的距离)

     
    

顶点v是简单循环的一部分。

  

* low(v)= min(d(v),d(u),low(w))其中(v,u)是后边缘,w是DFS树中v的子节点。以O(| V | + | E |)时间计算。