2022.7.16 闲话
7.15 因为 CF 痛失一篇鲜花 .
如果一个二分图中每个点的度数都是 ,那么称作一个 - 正则二分图 .
Hall 定理
对于一个二分图 ,我们记 分别为其两边的点 . 对于 ,我们令 表示直接连到 的所有右边的点 .
如果对任意 ,都有 ,那么最大匹配数为 (即左边的每个点都能被匹配上).
特别的,如果 ,则此时存在完美匹配。
根据 Hall 定理,我们知道正则二分图一定是存在完美匹配的 .
匹配的求法详见 rqy 的博客:https://www.luogu.com.cn/blog/rqy/hall-theorem-regular-bigraph .
然后我们每次取一对匹配,就可以构造出 染色了 .
当然,还有另外一个做法,非常的 simple 啊 .
正则二分图 染色,这玩意可以做一般二分图,因为我们可以随手补成正则二分图 .
所以,对于一般二分图,最小染色是最大点度数。我们基于这一点魔改匈牙利 .
由于每一条边都要丢进匹配内,为了调整答案的方便,类似匈牙利每次加入一个点,我们每次加入一条边 .
同时,也使用交错路增广 .
考虑在两个点之间加一条边,度数增加了 1,那么我们分别取值为 ,记为 ,来染色。
那么我们就要找一条 的交错路。
这个增广过程可以终止的原因是显然不会出现环,不然与 染色矛盾。
这样不断加入边,就可以一直维护染色的性质 .
每次访问 个点,复杂度 .
挺意识流,因为最开始写这个方法的人也是很意识流的写出来的 .
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);
}
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16485312.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】