【题解】CF1499G Graph Coloring 并查集、欧拉回路
考虑二分图 \(G=(V,E)\) 。
将边集 \(E\) 划分成若干个不交的集合,满足每个集合均为一条链或一个环,满足对于图 \(G\) 种的任意一个点是至多一条链的端点(起点 / 终点)。因为是二分图,所以所有的环都是偶数环。
考虑对链和环的边进行下面的染色:
* 红 → 黑 → 红 → 黑....
这样的话,答案就是端点个数 = 奇数度数点个数,为答案下界。
接下来考虑使用带权并查集动态维护这个结构:
-
\((u,v)\) 均不是链的端点。
-
\((u,v)\) 有一个点是链的端点。
-
\((u,v)\) \(u,v\) 均是链的端点。
- 若 \(u,v\) 在同一条链有可能成环。
在并查集中,用点到根节点路径上权值的异或和表示某个点的颜色即可。
一个经典问题
给定无向图 \(G=(V,E)\) 对边二染色,最小化 \(\sum |r(u)-b(u)|\) 。
建立虚点 \(V\) ,与所有奇数度的点连一条边,跑欧拉回路,按欧拉回路的边的方向染色:
- 红 → 黑 → 红 → 黑....