Algorithm 铰接点忽略指向直接父对象的边的反向

Algorithm 铰接点忽略指向直接父对象的边的反向,algorithm,graph,Algorithm,Graph,从普林斯顿的算法课程来看,连接算法dfs()忽略了导致v的边的反转。但为什么我们不能使用后向边,当它指向直接父对象时?请参考本部分代码 // **low number - ignore reverse of edge leading to v. Why is this???** else if (w != u) low[v] = Math.min(low[v], pre[w]); 完整代码如下 private void dfs(Graph G, int u, i

从普林斯顿的算法课程来看,连接算法dfs()忽略了导致v的边的反转。但为什么我们不能使用后向边,当它指向直接父对象时?请参考本部分代码

    // **low number - ignore reverse of edge leading to v. Why is this???**
    else if (w != u)
        low[v] = Math.min(low[v], pre[w]);
完整代码如下

private void dfs(Graph G, int u, int v) {
    int children = 0;
    pre[v] = cnt++;
    low[v] = pre[v];
    for (int w : G.adj(v)) {
        if (pre[w] == -1) {
            children++;
            dfs(G, v, w);

            // update low number
            low[v] = Math.min(low[v], low[w]);

            // non-root of DFS is an articulation point if low[w] >= pre[v]
            if (low[w] >= pre[v] && u != v) 
                articulation[v] = true;
        }

        // **low number - ignore reverse of edge leading to v. Why is this???**
        else if (w != u)
            low[v] = Math.min(low[v], pre[w]);
    }

    // root of DFS is an articulation point if it has more than 1 child
    if (u == v && children > 1)
        articulation[v] = true;
}

根据此算法()的定义:

  • pre[v]是v的DFS预排序索引,换句话说,是DFS树中该顶点的深度
  • low[v]是DFS树中v的所有后代(包括v本身)的邻居的最低深度
因此,在调用
DFS(G,u,v)
期间,我们不应检查反向边
(v->u)
,因为顶点u是v的祖先,因此在
低[v]
计算中不应考虑它

可在此处找到进一步的解释: