求解割点或点双时一种奇怪写法的说明

一、没有自环的(如果有自环直接先过滤掉即可)无向图上割点,反向边并不需要判断 v != fa,也就是并不需要判断它会回去。这个时候 \(low\) 数组的意义发生了改变,但是不影响求解结果。

简单说明一下就是,这样之后相当于,原先如果 \(low[u] \ne dfn[u]\),那么新的 \(low[u]\) 还是原来的 \(low[u]\),但是如果原先 \(low[u] = dfn[u]\),新的 \(low[u]\) 会变成 \(u\) 的父亲的 \(dfn\)。会发现:完全不影响 \(low[v] \ge dfn[u]\) 这个判断。

所以可以成为割点的一种偷懒写法。但注意 \(low\) 意义已经发生了改变!!因此如果 tarjan 时要用到 \(low\) 数组需要慎重考虑一下。

然后,注意割边不能这么偷懒。。

二、在用了第一个偷懒方法的情况下,\(low[v] \ge dfn[u]\) 可以写作 \(low[v] = dfn[u]\)

因为事实上原来满足 \(low[v] \ge dfn[u]\)\(low[v]\) 就只有两种取值:\(dfn[v]\)\(dfn[u]\)。那么第一个偷懒方法之后,\(low[v] = dfn[v]\) 时,\(low[v]\) 会变成 \(dfn[u]\)。那么条件自然就可以变换成 \(low[v] = dfn[u]\)

posted @ 2022-10-13 01:36  dbxxx  阅读(51)  评论(0编辑  收藏  举报