V i z i n g \rm Vizing Vizing 定理
图 G G G 的 k k k 染色:将每条 边 染成 k k k 种颜色之一,使得任意两条共端点的边异色。
定义
χ
(
G
)
\chi(G)
χ(G) 为,使得
G
G
G 的
k
k
k 染色存在的最小
k
k
k 。对于一个二部图
G
G
G,假设点的度数最大是
D
(
G
)
\frak D(G)
D(G),则有
χ
(
G
)
=
D
(
G
)
\chi(G)=\frak D(G)
χ(G)=D(G)
证明可以使用调整法。依次考虑每条边,设当前考虑到 ( x , y ) (x,y) (x,y),记 v x v_x vx 为 x x x 已染色的邻边的颜色集合中,未出现过的最小正整数。显然 v x , v y ⩽ D ( G ) v_x,v_y\leqslant\frak D(G) vx,vy⩽D(G),现在我们只需要致力于连一条 v x v_x vx 颜色的边。
如果 v x = v y v_x=v_y vx=vy,连上便是。否则,不妨设 v x < v y v_x<v_y vx<vy,即 y y y 已连了一条 v x v_x vx 颜色的边 e e e 。考虑将 e e e 的颜色修改为 v y v_y vy 。可能导致 e e e 的另一个端点出现矛盾,需要递归修改。形式化地:
从 y y y 出发找一条极长增广路径 y , p 1 , p 2 , … , p k y,p_1,p_2,\dots,p_k y,p1,p2,…,pk,经过的边的颜色依次是 v x , v y , v x , v y , … , v x / y v_x,v_y,v_x,v_y,\dots,v_{x/y} vx,vy,vx,vy,…,vx/y 。
由于图是二分图,不妨让 x x x 在 X \frak X X 部, y y y 在 Y \frak Y Y 部,那么每次走到 p i ∈ X p_i\in\frak X pi∈X 都是经由一条 v x v_x vx 颜色的边,每次走到 p i ∈ Y p_i\in\frak Y pi∈Y 都是经由一条 v y v_y vy 颜色的边。由于每个点的临边颜色不同,所以 没有点被重复经过。
同样可以发现,路径不会包含 x x x,否则走到它的时候就已经出现了 v x v_x vx 颜色的边,与 v x v_x vx 定义矛盾。将这些边的颜色全部翻转,即 v x → v y v_x\rightarrow v_y vx→vy 而 v y → v x v_y\rightarrow v_x vy→vx,图仍然合法。
此时边 ( x , y ) (x,y) (x,y) 可以被染成 v x v_x vx 颜色。于是定理得证。
例题
题目描述
有一个二分图,你需要将所有边染上
c
c
c 种颜色之一,使得
∑
v
x
\sum v_x
∑vx 最小。其中
v
x
=
max
j
=
1
c
w
x
(
j
)
−
min
j
=
1
c
w
x
(
j
)
v_x=\max_{j=1}^{c}w_x(j)-\min_{j=1}^{c}w_x(j)
vx=maxj=1cwx(j)−minj=1cwx(j),定义
w
x
(
j
)
w_x(j)
wx(j) 为
x
x
x 的邻边中颜色为
j
j
j 的数量。你只需输出这个最小和。
数据范围与提示
点数
n
⩽
2
×
1
0
6
n\leqslant 2\times 10^6
n⩽2×106,边数
k
⩽
1
0
6
k\leqslant 10^6
k⩽106,颜色种类数
c
∈
[
1
,
1
0
5
]
c\in[1,10^5]
c∈[1,105] 。
思路
不难发现 答案有一个下界是
n
−
∑
i
=
1
n
[
c
∣
deg
i
]
n-\sum_{i=1}^{n}[c\mid \deg_i]
n−∑i=1n[c∣degi],即所有度数为
c
c
c 倍数的点提供
0
0
0 的贡献,其余的提供
1
1
1 的贡献。证明需要用到
V
i
z
i
n
g
\rm Vizing
Vizing 定理(话说一般人都不会往这方面想吧)。
首先拆点(才能套用 V i z i n g \rm Vizing Vizing 嘛),将一个点拆成 ⌊ deg c ⌋ \lfloor{\deg\over c}\rfloor ⌊cdeg⌋ 个度数为 c c c 的点,和一个度数为 deg m o d c \deg\bmod\;c degmodc 的点。原来接在这个点上的边,可以任意分配,只要满足度数的条件。新的图仍然是二分图,运用 V i z i n g \rm Vizing Vizing 定理将边染色。如果把拆出来的点合并回原来的点,考虑 v x v_x vx 的值:显然度数为 c c c 的点是 w ( j ) = 1 ( 1 ⩽ j ⩽ c ) w(j)=1\;(1\leqslant j\leqslant c) w(j)=1(1⩽j⩽c) 的,合并这个点不会导致 v x v_x vx 变化。所以只有度数为 deg m o d c \deg\bmod\;c degmodc 的点,是 w ( j ) = 1 ( j ∈ S ) w(j)=1\;(j\in S) w(j)=1(j∈S),提供 1 1 1 的贡献。如果 c ∣ deg c\mid\deg c∣deg 则不存在该点,也就没有贡献了。
原题就有了一个 O ( n + k ) \mathcal O(n+k) O(n+k) 的做法。
后记
模仿二分图匹配 H u n g a r y \rm Hungary Hungary 算法,我们证明了 V i z i n g \rm Vizing Vizing 定理。一个很有意思的地方是, H u n g a r y \rm Hungary Hungary 算法是可能无法增广的,而 V i z i n g \rm Vizing Vizing 总是可以!
还有一般简单图上的情况,这个我就搞不懂了,只能靠读者自己阅读了……