我对此answer感到困惑。为什么DFS在访问每个节点和每个边缘最多一次时无法确定有向图中是否存在循环?使用white, gray, black方法,如果存在后沿,应该能够找到一个循环。
对于未连接的有向图,为什么不能执行以下操作:从任意节点v
运行DFS并访问与v
连接的节点数,然后在另一个未访问的节点上运行DFS图中的任意节点(如果有),直到访问所有节点?
在我看来,DFS应该能够在最多o(|V|+|E|)
时间内找到一个周期。 above mentioned answer中的此声明是错误的吗?
“可以在没有a的情况下在DFS中多次访问节点 循环现有“
此外,正如此other answer所示,如果存在循环,DFS应在探索最多|V|
个边后找到它,因此运行时间实际为O(|V|)
。
我错过了什么?
更新和结论:
根据Pham Trung的评论,看起来该答案中的“简单DFS”是指从强连接图中的一个节点开始的DFS。据我了解,对于图表可能未连接的一般情况,以下陈述应为真:
O(d.|V|+|E|)
,其中d
是所有节点中的最大度数(即我们可以使用这种基于DFS的算法访问每个节点的最大时间)O(|V|)
边后,找不到循环,则它不存在。所以运行时真的是O(|V|)
。答案 0 :(得分:1)
想象一下,我们有这些带有这些边缘的简单图形:
1 - > 3
2 - > 3
1 ----->3
^
|
2--------
所以,在我们的第一个dfs中,我们发现节点1和3.然后,我们继续用节点2做dfs,现在,我们再次遇到节点3,但这是一个循环吗?显然不是。
又一个例子:
1 - > 3
1 - > 2
2 - > 3
1----->3
| ^
| |
| |
v |
2-------
因此,从节点1开始,我们访问节点3,返回节点2,现在,我们再次遇到节点3,而且,这种情况下,它也不是一个循环。
据我所知,来自Jay Conrod的答案的简单深度优先搜索意味着正常的原始DFS(仅检查连接的组件)。在同一个答案中,他还描述了如何修改简单DFS 以找到循环的存在,这正是OP引用的算法。在下面,另一个答案也提到了着名的Introduction to algorithm
书中的引理
当且仅当G的深度优先搜索没有产生后沿时,有向图G才是非循环的
简而言之,OP对有向图中检测周期的理解是正确的,只是一些复杂性和捷径导致了误解。