【问题标题】:Why Depth First Search checks vertices this way?为什么深度优先搜索以这种方式检查顶点?
【发布时间】:2020-09-06 04:28:36
【问题描述】:

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

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

【问题讨论】:

    标签: graph depth-first-search


    【解决方案1】:

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

    【讨论】:

    • 但是在哪种情况下 w === u 是真的?我只看到顶点指向自身时
    • 它不是针对自己的。 adj 包含 v 和父 u 的所有子代。所以,当wu 因为我们已经访问过它,!this._marked[w] 是 False。但是我们可以将其视为一个循环,因为它计算了两条路径 P(root, ..., u)P(root, ..., u, v, u) i> 作为两条不同的路径,它们不会产生循环。
    • 哦,现在我明白了。是的,我犯了一个愚蠢的错误。我忘记了如果顶点 1 与 2 相邻,那么 2 与 1 相邻。这就是它返回父节点的原因,我们根本需要进行检查。谢谢!
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多