为什么“深度优先搜索”以这种方式检查顶点?

问题描述

我正在学习图形,并且遇到了深度优先搜索算法的这种实现,该算法可以在图形中查找循环

我们为什么要检查w !== uw === 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;
        }
    }   
}

解决方法

似乎您的算法适用于无向图,并且uv的父级。调用this._graph.adj(v)时,它将返回包括父项u的所有相邻项。条件w !== u检查您是否两次访问过节点,这意味着从根到节点有两条不同的路径。这意味着一个周期。但是,在u是父节点的情况下,您要对边缘E(u,v)进行两次计数,这不是周期的定义。