问题描述
我正在学习图形,并且遇到了深度优先搜索算法的这种实现,该算法可以在图形中查找循环
我们为什么要检查w !== u
。 w === u
在哪种情况下可以?
dfs(v,u) {
this._marked[v] = true;
const adj = this._graph.adj(v);
for (const w of adj) {
if (!this._marked[w]) {
this.dfs(w,v);
} else if (w !== u) {
this.hasCycle = true;
}
}
}
解决方法
似乎您的算法适用于无向图,并且u
是v
的父级。调用this._graph.adj(v)
时,它将返回包括父项u
的所有相邻项。条件w !== u
检查您是否两次访问过节点,这意味着从根到节点有两条不同的路径。这意味着一个周期。但是,在u
是父节点的情况下,您要对边缘E(u,v)
进行两次计数,这不是周期的定义。