[口胡] HNOI2019校园旅行

暂时没有打代码的心思,就口胡一下...

前言

关于这个题,首先要知道的一个性质:

二分图中任意两个点间经过的边数的奇偶性是唯一确定的,反正,一个联通的非二分图中任意两点间路径经过的边数奇偶性都不确定

证明:
因为二分图上只有偶环,所以路径可以看成偶环的一部分或者一条路径上绕了多次偶环。以为环是偶的,所以不绕环的任意两条路径都能拼成一个偶环,奇偶性相同。
反之,如果是联通非二分图,那么就可以绕奇环改变奇偶性。

正解

首先考虑一个30分解法

我们有一个 \(O(m^2)\) 的dp解法:设状态为 \(f(i,j)\) 表示从 \(i\)\(j\) 的可达性。显然的,\((i,i)\) 与已给的边 \((u,v)\) 都是合法点对,就可以把他们加入队列里。之后,我们每次取队头,枚举左边的点所连的边和右边点所连的边,进行一个向外拓展。如果拓展后的左右点权相等就放进队列,否则就算了。

这做法其实很对,我们发现问题就出在边数很多,但点数很少。所以考虑把一些没用的边去掉。

首先我们发现,对于一个标记全为0或1的大小大于2的连通块 \(C\) 而言,如果路径 \(P\) 经过了 \(C\) ,那么我们可以往路径里面添加 \(2n\) 个这种标记,因为我们可以来回经过同一条路。所以我们只关心 \(C\) 贡献的 \(\delta\) 的奇偶性,不在意个数

结合上边的性质,我们发现,当这个 \(C\) 是二分图时,连通块内点对路径的奇偶性确定了;反之如果不是二分图那么就没法确定,可以改变。

为了去掉一部分没用的边,我们可以把每一个 \(C\) 都保留任意一颗生成树,如果不是二分图就加一个奇环,比如说自环。

这样缩完连通块之后,就只用考虑连接不同标记的边了。

我们发现一个优秀的性质,就是缩完连通块之后,这张图就被自然而然的黑白染色了,变成了一张二分图,可以继续缩成一颗生成树。

这样边数就降成了和点数同级,继续套用上边的dp方式,复杂度降为 \(O(n^2 + q)\) .

有能力了再把代码补上。

posted @ 2023-02-18 16:17  sky_light  阅读(23)  评论(0)    收藏  举报