正则二分图 K 染色

啊,正则二分图能 k 染色就不证了吧

学过好多遍,但是学一次忘一次 T^T

所以还是水成 blog 吧……

这玩意可以做一般二分图,因为我们可以随手补成正则二分图。

所以,对于一般二分图,最小染色是最大点度数。我们基于这一点魔改匈牙利。

由于每一条边都要丢进匹配内,为了调整答案的方便,类似匈牙利每次加入一个点,我们每次加入一条边。

同时,也使用交错路增广。

考虑在两个点之间加一条边,度数增加了 \(1\),那么我们分别取值为 \(\textrm{mex}\),记为 \(L, R\),来染色。

那么我们就要找一条 \(L, R, L, R, \dots\) 的交错路。

我们要说明这是可以终止的。显然不会出现环,不然与 \(\textrm{mex}\) 或染色矛盾。

这样不断加入边,就可以一直维护染色的性质。

每次访问 \(O(n)\) 个点,复杂度 \(O(nm)\)

void dfs(int l, int r, int x, int y, int cx, int cy) {
	col[l][x][cx] = y;
	if (int v = col[r][y][cx])
		col[l][v][cx] = 0, dfs(r, l, y, v, cy, cx);
	col[r][y][cx] = x;
}
void adde(int x, int y) {
	int ca, cb;
	for (ca = 1; col[0][x][ca]; ++ca) ;
	for (cb = 1; col[1][y][cb]; ++cb) ;
	dfs(0, 1, x, y, ca, cb);
}
posted @ 2020-09-07 20:33  daklqw  阅读(1327)  评论(0编辑  收藏  举报