如何检查边缘是否处于某个周期?

时间:2011-10-11 23:29:29

标签: graph cycle

我有一个问题,要求一个算法检测任何包含任何给定边'E'的无向图中是否有任何循环。算法应该在O(N)线性时间内运行。

我遇到的问题是我不知道从哪里开始。我有一些简单的示例图,但我不知道从那里去哪里。

任何提示?

5 个答案:

答案 0 :(得分:4)

从G中取出边缘(u,v) 1.运行BFS以查看是否仍可从u访问v。 2.如果是,则原始图形具有包含e的循环。否则没有。

答案 1 :(得分:2)

首先进行深度搜索,然后在返回时将节点添加到列表中,并在返回时从列表中删除它们。

该列表代表您当前的遍历路径。

如果您遇到列表中已有的节点,则会出现循环/循环。

答案 2 :(得分:0)

你从边缘'e'开始。从它你应该得到它连接的两个顶点。从它们中你可以获得其他边缘和其他顶点,以及其他边缘和其他顶点,并且...您需要一种方法来确定您的算法是否已经“访问过”顶点。如果它有,那么'e'就是一个循环。

答案 3 :(得分:0)

对于边缘(u,v):

1-从u开始执行深度优先搜索,确定是否找到v并且沿着v的路径存在后边缘。

2-从v执行深度优先搜索,如果找到u并且后边缘存在于u,那么有一个包含u和v的循环。

换句话说,

1-从u开始执行DFS,检查后边缘是否存在且v还没有完成。

2-从v开始执行DFS,检查后边缘是否存在且u尚未完成   如果两个条件都为真,那么edge(u,v)属于一个循环。

答案 4 :(得分:0)

在G上运行DFS,然后执行以下操作。考虑第一次穿越边缘e。

有两种情况:

    e是一个后盾。在这种情况下,e显然是循环的一部分,并且可以打印该循环。 e =(a,b)是树的边缘(遍历的方向是u到v)。现在开始第二阶段 算法。对于在DFS中找到的每个后端(w,x),请检查w是否是v的后代,并且x是 你的祖先如果是这样,我们发现了一个包含边e的循环。