Tarjan的强连接组件算法 - 为什么索引在后沿?

时间:2015-08-08 17:39:39

标签: algorithm graph language-agnostic directed-graph tarjans-algorithm

我正在研究Tarjan's algorithm for strongly-connected components,它的工作方式对我来说很清楚。无论如何,有一条我不明白的路线:

// Consider successors of v
for each (v, w) in E do
  if (w.index is undefined) then
    // Successor w has not yet been visited; recurse on it
    strongconnect(w)
    v.lowlink  := min(v.lowlink, w.lowlink)
  else if (w.onStack) then
    // Successor w is in stack S and hence in the current SCC
    v.lowlink  := min(v.lowlink, w.index) // *************
  end if
end for

我用星号标记了这一行。我们为什么要在遇到后端

时获取节点的发现索引/时间
v.lowlink  := min(v.lowlink, w.index)

而不仅仅是抓住其组件价值?

v.lowlink  := min(v.lowlink, w.lowlink)

我想不出这会出现问题的情况。

有人可以开导我吗? 编辑:我怀疑这只是一个语义要求,即低连接被定义为从只有一个后端的节点可以到达的最早的祖先,但这只是一个狂野的猜测。

1 个答案:

答案 0 :(得分:2)

如果w.lowlink至少是从w可到达的最低索引,并且最多可以使用至少一个后边缘从w到达的最低索引,则会通过正确性证明。组件检测只需要我们知道我们是否可以逃脱"到较低的指数。

可能它呈现方式的原因是,人们可以想象lowlink仅在后序中设置,然后您的变体将无法很好地定义。 (维基百科伪代码以预先的顺序将其初始化为index。)