我正在阅读一些关于在图表中查找关节点的教程,并偶然发现了这个
1
从G开始,从任何节点开始进行深度优先搜索。设T为 深度优先搜索生成的树,以及每个节点v 在图表中,让prenum [v]为搜索指定的数字。
2
以后序遍历树T.对于每个访问过的节点v,计算 最低[v]为每个节点w的prenum [v] prenum [w]的最小值 在G中存在没有相应边缘的边(v,w) T中每个孩子x的最低[x]。
3
关节点是 现确定如下。 T的根是G的清晰点 当且仅当它有一个以上的孩子。除了之外的节点v 当且仅当v具有子x时,T的根是关节点G. 这样最低[x]≥prenum[v]。
但我真的不懂如何计算最低[x]。任何人都可以让它更清楚一点吗? 谢谢!
答案 0 :(得分:1)
第2步,伪代码:
def visit(v):
lowest[v] = prenum[v]
for w in nodes:
if v is the parent of w in T:
visit(w)
lowest[v] = min(lowest[v], lowest[w])
elif w is connected to v in G:
if w is not the parent of v in T:
lowest[v] = min(lowest[v], prenum[w])
答案 1 :(得分:0)
结合步骤1和2的迭代伪代码版本:
i = 0
prenum[1] = lowest[1] = i = i + 1
S = EMPTY STACK
for each edge e connected to nodes[1]:
push edge e onto S
while S is not empty:
peek at edge e on S
let (u,v) = e such that prenum[u] <= prenum[v] or prenum[v] is undefined
if e is unvisited
mark e as visited
if prenum[v] is undefined
mark e as parent of v
prenum[v] = lowest[v] = i = i + 1
for each edge e' connected to nodes[v] except e:
push edge e' onto S
else
pop e from S
lowest[v] = min( lowest[v], prenum[u] )
else
pop e from S
if e is marked as parent of v
lowest[u] = min( lowest[u], [lowest[v] )