我是一名高级学生,在算法上学习奥林匹克信息学,这是我关于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:)
答案 0 :(得分:1)
实际上是正确的。
正确性的证明取决于low
的两个属性。第一个是,对于所有v
,w
存在v
,dfn[w] <= low[v] <= dfn[v]
。v
。第二个问题是,在确定w
是否为根时,我们可以v
从low[v] <= dfn[w]
u
到达所有v
。
我们可以归纳地证明,如果存在从v
到w
的路径以及从u
到w
的路径,第一个属性仍然存在,然后是从low
到low'
的路径。至于第二个,让v
成为原始数组,low'[v] <= low[v]
是你的。对于v
所有w
来说,v
所有low'[v] <= low[v] <= dfn[w]
并不难,因此在low
的关键时刻,{{1}}可以从{{1}}到达},它认为{{1}}。
我认为算法的呈现方式是避免考虑{{1}}的中间值。