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相邻。这就是它返回父级的原因,我们需要进行检查。谢谢