关于tarjan的查找scc的算法

时间:2013-04-27 09:14:27

标签: algorithm depth-first-search tarjans-algorithm

我是一名高级学生,在算法上学习奥林匹克信息学,这是我关于stackoverflow的第一个问题。

在tarjan的dfs搜索中获取 lowlink(u)

low[u]=min(low[u],low[v])(v未被访问)

low[u]=min(low[u],dfn[v])(v仍然在堆栈中)

我的问题是,在第二种情况下替换 dfn [v] 低[v] 仍然可以吗?我知道这是不正确的,但我找不到反例。任何人都可以帮忙解释一下吗?

THX:)

1 个答案:

答案 0 :(得分:1)

实际上是正确的。

正确性的证明取决于low的两个属性。第一个是,对于所有vw存在vdfn[w] <= low[v] <= dfn[v]v。第二个问题是,在确定w是否为根时,我们可以vlow[v] <= dfn[w] u到达所有v

我们可以归纳地证明,如果存在从vw的路径以及从uw的路径,第一个属性仍然存在,然后是从lowlow'的路径。至于第二个,让v成为原始数组,low'[v] <= low[v]是你的。对于v所有w来说,v所有low'[v] <= low[v] <= dfn[w]并不难,因此在low的关键时刻,{{1}}可以从{{1}}到达},它认为{{1}}。

我认为算法的呈现方式是避免考虑{{1}}的中间值。