【题解】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\) ,与所有奇数度的点连一条边,跑欧拉回路,按欧拉回路的边的方向染色:

  • 红 → 黑 → 红 → 黑....
posted @ 2021-10-19 14:36  Themaxmaxmax  阅读(51)  评论(0编辑  收藏  举报