二分图 <=> 不存在奇环
二分图判定:黑白染色
CF构造题
http://www.renfei.org/blog/bipartite-matching.html
一、二分图的最大匹配问题
匈牙利算法
int n; int a[maxn][maxn]; //互相喜欢 int link[maxn]; //第i个女生的男伴是谁 bool vis[maxn]; //表示第i个女生有没有在这一次找搭档过程中被邀请 bool dfs(int x) //给第x个男生找搭档 { for(int i = 1; i <= n; ++i) //遍历每个女生 { if(!a[x][i] || vis[i]) continue; vis[i] = 1; if(link[i] == 0 || dfs(link[i])) //直接匹配或者给第i个女生的男伴重新找一个搭档 { link[i] = x; return 1; } } return 0; } int main() { cin >> n; int cnt = 0; for (int i = 1; i <= n; ++i) //遍历每个男生 尝试找搭档 { memset(vis, 0, sizeof(vis)); if(dfs(i)) ++cnt; //统计一共找到多少对 } }
复杂度:
邻接矩阵:O(n^3)
邻接表:O(nm)
最大匹配数:最多匹配的对数(每个顶点最多被一条边覆盖)
最小点覆盖数:每个点覆盖以它为端点的所有边,选择最少的点来覆盖所有边
二分图的最大匹配数等于该图的最小点覆盖数
对于匹配的每一对,都选择一个顶点进行覆盖,此时其实已经覆盖完所有边了,因为若有一条边没有被覆盖,那么它就是一个新的匹配,加入,再被覆盖。
二、二分图最优匹配----KM算法