检查图中的顶点是否属于循环

时间:2014-11-10 05:37:02

标签: algorithm graph depth-first-search

我有一个无向图(可能有多个边),我需要检查一个给定的顶点是否属于O(|V|)中的某个循环。请注意,图表可能很密集。

3 个答案:

答案 0 :(得分:2)

如果您可以走出它并稍后通过其他顶点返回,则顶点将属于一个循环。

算法可以如下:

  1. 将当前顶点V 0 添加到已访问顶点列表中,V。

  2. sizeof(V)< N我们将列出V 1 ,...,V k ,你可以从V 0

  3. 重复步骤2,直到找到路上的V 0 - 这意味着它处于循环中 - 或者直到sizeof(V)= N或者没有新的顶点可以添加到V(图可能会断开)。 注意:重复步骤2意味着我们可以找到最后添加的一组顶点列表(V 1 ,...,V k < /子>)。

  4. 使用这个算法,我看到每个顶点只检查一次,所以它是O(| V |)。

答案 1 :(得分:1)

您可以在图表中继续删除叶子(只有1个非多边缘)。如果v不在循环中,则必须移动它。此外,当v包含在某个循环中时,v不能被删除,因为循环中的任何顶点都不会成为叶子。你需要删除| V |最多也是顶点,你需要只考虑一条边,因为你在每一步都去掉一片叶子。所以它是O(V)方法。

答案 2 :(得分:0)

一个顶点,v属于一个循环,如果DFS以此顶点为根,则包含与v相邻的后边缘。很容易看出这种情况就足够了。为了表明有必要,请考虑v所属的循环。让其周期中的邻居为xy。由于xyv位于一个周期内,因此从vy的路径经过x,反之亦然。因此,xy位于DFS的同一子树中。因此,至少有一个边xvyv不能是树边缘。换句话说,这两个边中的至少一个是后备。