类似这道题,颜色数不一定是 (2) 了。
(nle 20),(kle 10),(qle 5cdot 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 floor) 个度数为 (k) 的点,当 (k mid d_x) 时再搞一个度数为 (d_xmod k) 的点。然后加边就按上面方法做,删边的话就如果这条边连的不是当前点最后一个拆出来的点,就从最后一个点拆一条边过来。
时间复杂度 (O(qn^2/k)),实现还是有点烦的,建议看代码。