我在 Stack Overflow 上读到一个关于查找有向图中的循环的讨论(链接)。现在,楼主声称我们需要验证两件事情:
u
到v
有一条反向边v
在递归栈中
u
到 v
有一条反向边v
在递归栈中v
也在递归堆栈中才能检测到循环。A -> B -> C
。
在这个例子中,边<A,C>
是无向图中的反向边(因为C已经被访问过)。
但它不是这个有向图中的反向边——C已经被访问过,但不在递归堆栈中,这意味着它不是一个循环。
vertices a,b,c,d
a->b
a->c
b->d
d->c
根据处理的顺序,d->c
可以被视为交叉边,因此需要执行步骤2来检测循环。不幸的是,后向边和交叉边经常混淆,导致这样的困惑。这里有另一个描述两者之间区别的链接深度优先搜索。