查找关节点

时间:2015-04-08 01:34:00

标签: graph-theory

我正在阅读一些关于在图表中查找关节点的教程,并偶然发现了这个

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]。

enter image description here

但我真的不懂如何计算最低[x]。任何人都可以让它更清楚一点吗? 谢谢!

2 个答案:

答案 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] )