Description
Solution
真是只神题啊。
算法一
首先考虑一个 O ( m 2 ) O(m^2) O(m2) 的算法。
令 f i , j f_{i,j} fi,j 表示,是否存在一条以 i i i 为起点,以 j j j 为终点的标号回文路径。
转移式子非常显然。若 f i , j = 1 f_{i,j}=1 fi,j=1,且存在边 ( u , i ) ( v , j ) (u,i)(v,j) (u,i)(v,j) 使 u , v u,v u,v 的权值同奇同偶,那么 f u , v = 1 f_{u,v}=1 fu,v=1。
使用 SPFA 进行转移即可。不难发现每一对原图上的边都对复杂度贡献了 O ( 1 ) O(1) O(1),且 SPFA 在本题中复杂度与边数线性相关,因此时间复杂度是 O ( m 2 ) O(m^2) O(m2)。
算法二
注意到,我们其实只关心首尾每一对极长 01 01 01 段的奇偶性。例如,某条路径上的权值依次为 00011110 00011110 00011110,那么可以通过在某条边上多次徘徊将其变为回文串 0001111000 0001111000 0001111000。
考虑将原图中的某些没用的边去掉(即这些边无法改变奇偶性),将 m m m 缩减到 O ( n ) O(n) O(n) 的级别。此时套用算法一中的 dp \text{dp} dp 就足以通过了。
将边分为同色边(即边两端的节点权值相同)以及异色边两类。
对于前者,我们考虑每一个同色边组成的连通块。若这个连通块是一张二分图,那么它就是个垃圾(两点间路径经过的点数的奇偶性确定),我们可以尝试破罐子破摔,在其 ⌈ \lceil ⌈ 连通且垃圾 ⌋ \rfloor ⌋ 的前提下使其边数最小——不难想到保留它的一棵生成树。若这张连通块不是二分图,那么它很优秀,于是可以在其 ⌈ \lceil ⌈ 连通且优秀 ⌋ \rfloor ⌋ 的前提下使其边数最小——不难想到保留它的一个生成树并在某个节点处加一个自环。
对于后者呢?不难发现,对于每个异色边组成的连通块都是个二分图,所以对于这些垃圾全部保留生成树即可。
边数为 O ( n ) O(n) O(n) 级别,总复杂度 O ( n 2 ) O(n^2) O(n2),本题被解决。

461

被折叠的 条评论
为什么被折叠?



