我有一个无向图(可能有多个边),我需要检查一个给定的顶点是否属于O(|V|)
中的某个循环。请注意,图表可能很密集。
答案 0 :(得分:2)
如果您可以走出它并稍后通过其他顶点返回,则顶点将属于一个循环。
算法可以如下:
将当前顶点V 0 添加到已访问顶点列表中,V。
sizeof(V)< N我们将列出V 1 ,...,V k ,你可以从V 0
重复步骤2,直到找到路上的V 0 - 这意味着它处于循环中 - 或者直到sizeof(V)= N或者没有新的顶点可以添加到V(图可能会断开)。 注意:重复步骤2意味着我们可以找到最后添加的一组顶点列表(V 1 ,...,V k < /子>)。
使用这个算法,我看到每个顶点只检查一次,所以它是O(| V |)。
答案 1 :(得分:1)
您可以在图表中继续删除叶子(只有1个非多边缘)。如果v不在循环中,则必须移动它。此外,当v包含在某个循环中时,v不能被删除,因为循环中的任何顶点都不会成为叶子。你需要删除| V |最多也是顶点,你需要只考虑一条边,因为你在每一步都去掉一片叶子。所以它是O(V)方法。
答案 2 :(得分:0)
一个顶点,v
属于一个循环,如果DFS
以此顶点为根,则包含与v
相邻的后边缘。很容易看出这种情况就足够了。为了表明有必要,请考虑v
所属的循环。让其周期中的邻居为x
和y
。由于x
,y
和v
位于一个周期内,因此从v
到y
的路径经过x
,反之亦然。因此,x
和y
位于DFS
的同一子树中。因此,至少有一个边xv
和yv
不能是树边缘。换句话说,这两个边中的至少一个是后备。