我正在研究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)
我想不出这会出现问题的情况。
有人可以开导我吗? 编辑:我怀疑这只是一个语义要求,即低连接被定义为从只有一个后端的节点可以到达的最早的祖先,但这只是一个狂野的猜测。
答案 0 :(得分:2)
如果w.lowlink
至少是从w
可到达的最低索引,并且最多可以使用至少一个后边缘从w
到达的最低索引,则会通过正确性证明。组件检测只需要我们知道我们是否可以逃脱"到较低的指数。
可能它呈现方式的原因是,人们可以想象lowlink
仅在后序中设置,然后您的变体将无法很好地定义。 (维基百科伪代码以预先的顺序将其初始化为index
。)