Tarjan的强连通分量算法 - 为什么在反向边中使用索引?

9

我正在学习Tarjan算法求强联通分量,对它的工作原理已经很清楚了。但是有一行我不太明白:

// 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)

我想不出这会成为问题的情况。
有人能给我解释一下吗? 编辑:我怀疑这只是语义上的要求,即lowlink被定义为从具有仅一个反向边的节点可达的最早祖先,但这只是一个猜测。

Tarjan提出了许多优雅的算法。希望你不介意我的编辑。 - tmyklebu
绝对不是。很抱歉一开始没有明确说明。谢谢。 - Dean
1
请在此处阅读我的答案:[http://stackoverflow.com/questions/24114178/tarjans-algorithm-time-complexity-and-slight-modification-possibility/24114310#24114310] - Pham Trung
1个回答

5

如果w.lowlink至少是从w可达的最低索引,且最多使用一个反向边从w可达的最低索引,则正确性证明成立。组件检测只需要我们知道是否可以“逃脱”到更低的索引。

可能之所以以这种方式呈现它是因为可以想象lowlink仅在后序中设置,然后您的变化将无法定义良好。(维基百科伪代码在前序中初始化为index。)


1
哇,谢谢!我一直在想为什么它不起作用,现在知道它可以工作了! - Juan Carlos Ortiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接