我正在研究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)
我想不出这会成为问题的情况。
有人可以启发我吗?编辑:我怀疑这只是一个语义要求,即低链接被定义为从只有一个 back-edge的节点可到达的最早祖先,但这只是一个疯狂的猜测。