使用dfs_low和dfs_num查找关节点

时间:2014-10-24 14:59:28

标签: algorithm

我正在阅读算法以在图表中找到关节点。

When we are in vertex u and v is its neighbor, then if dfs_low(v) >= dfs_num(u) then u is a cut vertex

dfs_num(i)为dfs中的顶点编号。

dfs_low(i)告诉我可以从i到达的最低编号顶点。

我想知道这个算法如何适用于3节点循环。 (看起来像一个三角形)。

运行此算法,我得到(其中i = 0,1,2)

dfs_num(i) = i
dfs_num(i) = 0

这将返回0作为切割顶点,这显然不是关节点。 我相信我在这里有一些误解。有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:1)

root是一个特殊情况,因为它没有父级。如果DFS树中有多个子节点,则根是一个关节点。非根节点v是一个关节点,当且仅当它有一个没有后边缘的子树指向v的祖先时。

答案 1 :(得分:0)

另一个不那么抽象的方法来理解这个想法是只绘制图形的DFS树(而不是整个图形)。

如果这棵树的根有一个孩子,那么您知道删除它就像删除一行的终点。例如,如果A是根:

删除之前: A--B--C--D

删除后: B--C--D

但是,如果根有一个以上的子节点,则可以直观地看到,移除根节点将把这两个子节点分隔开,这两个子节点现在无法彼此相遇(因为如果这样做,DFS遍历将发现该边缘它们和DFS树的根之间只有一个孩子)。例如:

删除之前:

enter image description here

删除后:

enter image description here

因此,由于删除此节点会将图形分为无法相互到达的两个或更多部分,因此它是一个关节点。