二分图学习笔记
二分图判定
染色法。
另外,对于任意无向图,不存在奇环时一定是二分图。
二分图最大匹配
“任意两边都没有公共端点”的边的集合称为二分图的一组匹配。边数最大的匹配为最大匹配。
增广路:两端点都在左部,由非匹配、匹配、非匹配、匹配……非匹配的边组成的路径。将增广路上的匹配边与非匹配边取反,所得到的新的边集一定也是一组匹配,且边数+1。
匈牙利算法通过不断寻找增广路并将其取反,从而得到最大匹配。
bool dfs(int x) {
for (int i = head[x]; i; i = nxt[i]) {
int y = ver[i];
if (!vis[y]) {
vis[y] = 1;
if (!match[y] || dfs(match[y])) {
match[y] = x; return 1;
}
}
}
return 0;
}
for (int i = 1; i <= n; i++) {
memset(vis, 0, sizeof (vis));
if (dfs(i)) ans++;
}
算法实现中似乎并没有寻找增广路的部分,但仔细分析:
设x1尝试匹配y1,此时若y1没有匹配,则x1 ~ y1为增广路,匹配x1与y1即为取反增广路;
若y1匹配x2,那么dfs(x2)。此时发现x2与y2相连但未匹配,则x1 ~ y1 ~ x2 ~ y2为增广路,匹配边=1。将x2与y2匹配,x1与y1匹配即为取反增广路,匹配边=2。
匈牙利算法基于深搜实现,return值为找到/没找到增广路,递归时改变match,实质是将增广路取反的过程。
应用
二分图最大匹配难点在于建模。其要旨在于寻找“0要素”与“1要素”。
0要素:节点能分成两个独立的集合,集合内没有边相连。
1要素:每个节点只能与一条匹配边相连。
例:棋盘覆盖Acwing372
此题,我们将棋盘染色,对于格子(i,j),若i+j为偶数则染成白色,i+j为奇数则染成黑色。将格子作为二分图中的节点,满足0要素。放置骨牌相当于匹配两个节点,骨牌不能重合,满足1要素。要让骨牌不重叠的情况下尽量多放,即为求二分图的最大匹配。
一些NB的推广
最小点覆盖
在给定二分图中求出一个最小的点集,使得图中任意一条边都有至少一个端点属于。此集合称为二分图的最小点覆盖。
结论:二分图中最小点覆盖包含的点数=最大匹配数。
证明:略
例:AsteroidsPOJ3041
抽象:在一个矩阵中有若干点,每次选择一行或一列并标记其上所有点。问最少需要几次操作标记所有点。
将行作为二分图的左部,列作为二分图的右部,每个点作为一条边。每次操作选择一个点,并标记与之相联的所有边。易得,原问题的答案即为二分图中最小点覆盖包含的个数。
最大独立集
最大独立集为一个点集,且满足集合中任意两点没有边相连。此问题的求解在一般无向图中无法用多项式时间复杂度解决,但在二分图中有巧妙的转化方法。
结论:二分图的大小为n,则其最大独立集的大小=n-最大匹配数。
证明:
选出最多的点构成独立集
⇔在图中删去最少的点,并删去这些点的相连边,使图中没有边
⇔用最少的点覆盖所有边
⇔求解最小点覆盖
于是,去掉二分图的最小点覆盖,剩下的所有点构成最大独立集。
例:骑士放置Acwing378
我们可以惊奇地发现,当对棋盘染色(同上)后,白点只能走到黑点,黑点只能走到白点。于是考虑构建二分图。白点为左部,黑点为右部。连接一个点与其能跳到的所有点。那么,相邻的两点不可以同时选择。求最多选择多少点,即为求最大独立集。
最小路径点覆盖
简称最小路径覆盖。对于一张DAG,用最少的互不相交的路径覆盖所有点。“相交”定义为经过相同的点。单独一点也算一条路径。
将图中每个点拆成两个点:入点与出点,每条有向边从出点指向入点。新图记为。
结论:最小路径点覆盖包含的路径条数=n-的最大匹配数。
不难看出为二分图。不妨设出点为左部,入点为右部。则最小路径覆盖中的所有边在中构成一组匹配。且每条路径的终点的出点一定为孤立点,所有出点为孤立点的点一定为路径的终点。于是问题转化为:求二分图左部的非匹配点最少为多少。于是得到以上结论。
最小路径可重复点覆盖
概念与上相似,但路径可以相交。
结论:对原图求传递闭包,在新图上的最小路径点覆盖即为答案。证明略。
例:捉迷藏Acwing379
藏身点个数=最小路径可重复点覆盖。
证明:即路径的终点集合为。表示中所有点能到达的点的集合。对于中的一点:
若,则可以作为藏身点;
若,则逆着此路径倒着走,直到为止。可证明此一定存在。用反证法:若此路径上的所有点都∈next(E),那么此路径不必存在,与“最少路径”矛盾。
In the end
图论博大精深。二分图还没学完,明天看多重匹配与带权匹配。
本文作者:realFish
本文链接:https://www.cnblogs.com/fish07/p/15961693.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步