从听课开始花了一天半时间来研究二分图有关的问题。
【关键词】
1、二分图
2、最大匹配
3、König定理与其他相关定理
4、最优匹配(最大权匹配)
一、二分图
概念:一个图G可以分成两个点集,使得仅这两个点集之间有边,点集内部没有连边。更严谨一点,没有奇环的图是二分图。
判定:从任意一点开始进行黑白染色,出现矛盾则不是二分图。
二、二分图最大匹配
概念:求得一种匹配方案使得尽可能多的点仅与相对点集的另一个点有连边。
算法:匈牙利算法,时间复杂度O(VE)。
算法思路:从每一个点开始找增广路,用dfs实现。
核心代码:
bool dfs(int x)
{
for(int i=0;i<edge[x].size();i++)
{
int nex=edge[x][i];
if(vis[nex]) continue;
vis[nex]=1;
if(!match[nex] || dfs(match[nex]))
{
match[nex]=x;
return true;
}
}
return false;
}
三、König定理与其他相关定理
注:以下说法除特殊说明外均为二分图。
König定理:最小顶点覆盖=最大匹配。
证明:因为二分图的最大匹配涉及的边两两无关,所以至少要选择最大匹配数的顶点才能完成最小顶点覆盖。若还有一条边(u,v)没有被覆盖,那么显然这条边也是最大匹配中的边,结论成立。
其他定理:
最大独立集:选出一个点数最多的点集,使得这些点之间两两均无边连接。
最大独立集=节点数-最大匹配数。
最小边覆盖:用最少的边覆盖所有顶点。
最小边覆盖=最大独立集=节点数-最大匹配数。
最小路径覆盖:在DAG中选出最少的不交叉路径覆盖所有顶点。
将DAG转化为二分图,每个点拆成入点和出点两个点,对于一条路径(u,v),从u的出点连向v的入点即可。
同最小边覆盖。
剩余的最大团之类的后续填坑。
四、最优匹配(又称最大权匹配)
概念:一个二分图,每条边有权值,求一个权值和最大的匹配。
算法:KM算法,讲解见
这里
相关题目
一、矩阵的行列匹配问题
bzoj3140(好题)
此类问题一般都是比较难看出二分图的构图方式和模型,看出来了就比较简单解决。
二、定理题
最小路径覆盖
本质上都是一类问题。
最小顶点覆盖
三、最优匹配问题
总结
1、二分图的模型一般隐藏的比较深,一定要仔细观察。
2、熟记套路,比如行列,男女,黑白等。
3、灵活运用,不能死磕模板。