Algorithm 查找作为简单循环一部分的所有顶点

Algorithm 查找作为简单循环一部分的所有顶点,algorithm,graph,cycle,depth-first-search,Algorithm,Graph,Cycle,Depth First Search,有没有一种方法可以在一个线性时间内找到属于图中一个简单循环的所有顶点 我找到了一种在O(| V |)(|V |+| E |)时间内完成的方法,但想知道是否有更快的方法?使用DFS(深度优先搜索),您可以在O(| V |+| E |)时间内完成。在实现DFS的过程中,只要在发现子节点与父节点相同(意味着循环的完成)时保留您一直跟踪的父节点的Vertive记录,就可以将从该父节点到最后一个子节点的所有节点声明为某个简单循环的一部分 如果您需要更多解释,请在下面进行评论。我喜欢巴维亚的回答:但如果我详

有没有一种方法可以在一个线性时间内找到属于图中一个简单循环的所有顶点

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

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


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

我喜欢巴维亚的回答:但如果我详细说明,会有所帮助

通常,如果您不使用DFS,则有一个已访问数组,该数组保持已访问/未访问状态

现在有

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


通过这种方式,如果在dfs上遇到一个访问值为0的顶点,则表示您有一个循环。若要查找循环上的顶点,请使用前置数组在路径中存储上一个顶点。

您要做的是删除所有顶点(即删除时断开组件连接的边)。维基百科的文章给出了一个线性时间算法来寻找所有的桥梁


一旦所有网桥都消失了,每个节点要么是孤立的(阶数为0),要么是循环的一部分。扔掉孤独的节点,剩下的就是你想要的节点。

好的,我想我找到了答案。 在处理DFS时,为每个顶点v计算low(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 |)时间计算。

可能吗?我不明白你到底想要什么。你是否有一个简单的循环并且必须找到它的顶点?如何规定该周期?给你一个图,你必须过滤掉不在某个循环中的任何顶点吗?给你一个图G=(V,E),找到一组顶点U,这样每个属于U的顶点U都是一个简单循环上的顶点这不是一个简单循环,这只是一个循环。简单循环不应该包含任何其他循环。这是我想到的算法,但我认为,如果每次我找到一个访问过的顶点跟踪它的所有前辈,我就可以有| V |圆(一个圆的一部分,它是圆的一部分等),并且对于每一个O(| V |)时间用于这个回溯。它和O(|V |(|V |+| E |))@SaeedAmiri相加:“简单循环”通常指顶点不出现一次以上的循环。你所描述的标准术语是“诱导循环”。@DavidRicherby它现在已经修复了。
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