Algorithm 铰接点忽略指向直接父对象的边的反向
从普林斯顿的算法课程来看,连接算法dfs()忽略了导致v的边的反转。但为什么我们不能使用后向边,当它指向直接父对象时?请参考本部分代码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
// **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]
计算中不应考虑它
可在此处找到进一步的解释: