Graph 为什么深度优先搜索会以这种方式检查顶点?
我正在学习图形,遇到了深度优先搜索算法的这种实现,它可以在图形中查找循环 为什么我们要检查Graph 为什么深度优先搜索会以这种方式检查顶点?,graph,depth-first-search,Graph,Depth First Search,我正在学习图形,遇到了深度优先搜索算法的这种实现,它可以在图形中查找循环 为什么我们要检查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
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.\u graph.adj(v)时,它返回所有相邻的函数,包括父函数u
。条件w!==u
检查您是否访问过一个节点两次,这意味着您从根节点到该节点有两条不同的路径。这意味着一个循环。但是,如果u
是父节点,则将边E(u,v)
计数两次,这不是循环的定义。但在哪种情况下,w==u可以为真?我只看到当一个顶点指向它自己时,它不是指向它自己adj
包含v
和父u
的所有子项。所以,当w
是u
时,因为我们刚刚访问了它,!此._标记为[w]
为假。但是我们可以把它看作一个循环,因为它把两条路径P(根,…,U)和P(根,…,u,v,u)作为两个不同的路径,它们不产生一个循环。哦,现在我明白了。是的,我犯了个愚蠢的错误。我忘记了如果顶点1与2相邻,那么2与1相邻。这就是它返回父级的原因,我们需要进行检查。谢谢