Graph 如何检查边是否在某个循环中?

Graph 如何检查边是否在某个循环中?,graph,cycle,Graph,Cycle,我有一个硬件问题,需要一个算法来检测在任何包含任何给定边“E”的无向图中是否存在任何循环。该算法应在O(N)线性时间内运行 我的问题是我不知道从哪里开始。我有一些简单的示例图,但我不知道从哪里开始 有什么提示吗?从边缘“e”开始。从中你应该得到它连接的两个顶点。从中可以得到其他边和其他顶点,以及其他边和其他顶点,并且。。。您需要一种方法来确定您的算法是否已经“访问”了顶点。如果有,则有一个循环是“e”的一部分。进行深度优先搜索,在进行时将节点添加到列表中,然后在返回时将其从列表中删除 该列表表示

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

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


有什么提示吗?

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

进行深度优先搜索,在进行时将节点添加到列表中,然后在返回时将其从列表中删除

该列表表示当前的遍历路径

如果遇到列表中已存在的节点,则存在循环/循环。

对于边(u,v):

1-从u开始执行深度优先搜索,确定是否找到v,以及沿v路径是否存在后缘

2-从v开始执行深度优先搜索,如果找到u且u存在后缘,则存在一个包含u和v的循环

换句话说,

1-从u开始执行DFS,检查后缘是否存在,v是否尚未完成

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

从G中取出该边(u,v)。 1.运行BFS,查看是否仍然可以从u到达v。
2.如果是,则原始图形有一个包含e的循环。否则就没有了。

在G上运行DFS并执行以下操作。考虑第一次遍历边缘E。

有两种情况:

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

  • 暗示?当然有些集合(如hashset)有O(1)查找。N的含义是什么?如果有多个循环怎么办?