2022.7.16 闲话

7.15 因为 CF 痛失一篇鲜花 .


如果一个二分图中每个点的度数都是 \(k\),那么称作一个 \(k\) - 正则二分图 .

Hall 定理

对于一个二分图 \(G\),我们记 \(L, R\) 分别为其两边的点 . 对于 \(S \subseteq L\),我们令 \(N(S)\) 表示直接连到 \(S\) 的所有右边的点 .

如果对任意 \(S \subseteq L\),都有 \(|N(S)| \geq S\),那么最大匹配数为 \(|L∣\)(即左边的每个点都能被匹配上).

特别的,如果 \(|L| = |R|\),则此时存在完美匹配。

根据 Hall 定理,我们知道正则二分图一定是存在完美匹配的 .

匹配的求法详见 rqy 的博客:https://www.luogu.com.cn/blog/rqy/hall-theorem-regular-bigraph .

然后我们每次取一对匹配,就可以构造出 \(k\) 染色了 .


当然,还有另外一个做法,非常的 simple 啊 .

正则二分图 \(k\) 染色,这玩意可以做一般二分图,因为我们可以随手补成正则二分图 .

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

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

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

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

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

这个增广过程可以终止的原因是显然不会出现环,不然与 \(\rm mex\) 染色矛盾。

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

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

挺意识流,因为最开始写这个方法的人也是很意识流的写出来的 .

Code by daklqw:

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 @ 2022-07-16 21:22  Jijidawang  阅读(142)  评论(0编辑  收藏  举报
😅​