CF1499G - Graph Coloring
CF1499G - Graph Coloring
题目大意
有一个二分图, \(m\) 条边,每条边可以选择为+1或者-1,表示两端的点权值 \(a_u,a_v\pm 1\)
最终的权值总和是 \(\sum |a_u|\)
现在要维护一个动态加边操作
每次加边之后动态维护一个最优的方案最小化权值和,输出其 \(\text{Hash}\) 和
分析
容易发现在最优中方案 \(|a_u|\leq 1\)
且一个点 \(a_u=\pm 1\) 当且仅当 \(deg_u \mod 2=1\)
在依次加入每条边的过程中,一旦出现环,显然环上的边经交错染色之后贡献可以忽略
且奇点总是成对地出现,两个成对的奇点能够确定一条路径
我们只需要在动态加边的过程中,维护对于这样奇点的路径以及环的交替染色即可
注意:
一个点可以被多条路径经过,但是在奇点成对地过程中
我们只认为其中一条的端点是它
那么我们在路径两端记录这条路径,每次加入一条边之后,可能产生多条路径的合并
而在实际实现的过程中,并没有必要把环从路径上删除
假设当前得到路径 \(x\rightarrow y\) ,加入一条边 \(y,z\) 且 \(z\) 在 \(x\rightarrow y\) 上
此时,我们直接认为新的路径端点就是 \((x,z)\) 即可
环的部分依然可以保留在路径上,跟随路径进行交替染色而不影响答案
此时操作被简化为了合并两段交替路径(实际上就是在合并欧拉路径)
可以用带权并查集维护
1 | const int N=4e5+10,P=998244353; |