UOJ444【集训队作业2018】二分图【构造,结论】

类似这道题,颜色数不一定是 \(2\) 了。

\(n\le 20\)\(k\le 10\)\(q\le 5\cdot 10^5\)


前置知识:二分图边染色(Vizing 定理)

对于二分图,可以用度数最大值个颜色给每条边染色,使得相邻边颜色不同。

构造方法直接按顺序遍历边,设当前尝试加入 \((x,y)\),设 \(x,y\) 的尚未用过的最小编号为 \(c_x,c_y\),若 \(c_x=c_y\) 则染 \(c_x\) 色即可,否则不妨设 \(c_x<c_y\),则尝试把 \(y\) 连出的颜色为 \(c_x\) 的边的颜色改为 \(c_y\),一直这样找下去就是从 \(y\) 出发,依次经过 \(c_x,c_y,c_x,c_y,\cdots\) 色的增广路,容易发现这个增广路不会自交,所以一定会停在其他某个点上,直接反色即可。每次修改的时间复杂度 \(O(n)\)

对应到这题,就直接拆点,假设当前点 \(x\) 度数为 \(d_x\),就拆成 \(\lfloor d_x/k\rfloor\) 个度数为 \(k\) 的点,当 \(k\nmid d_x\) 时再搞一个度数为 \(d_x\bmod k\) 的点。然后加边就按上面方法做,删边的话就如果这条边连的不是当前点最后一个拆出来的点,就从最后一个点拆一条边过来。

时间复杂度 \(O(qn^2/k)\)代码

posted @ 2021-06-03 21:33  mizu164  阅读(229)  评论(0编辑  收藏  举报