对于二分匹配问题有三个常用的结论:
1.二分图的最大匹配数等于最小覆盖数
2.二分图的独立数等于顶点数减去最大匹配数
3.最小路径覆盖 = 顶点数 - 最大匹配数(有向图要先拆点建二分图)
设最大匹配为M,匹配数为|M|
首先对于我们已经匹配的二分图
匹配|M|一定是有这样的性质的:
对于任意的<x,y>属于|M|只存在<a,x>或<y,b>,这两者是不可能同时存在的。
因为如果同时存在,那么我们必然能从新的增广路a-x-y-b得到更大的匹配M‘ 即|M|+1
对于第一个结论:
最小覆盖数是用顶点集合去覆盖边。
首先最小覆盖数肯定大于等于匹配M(M内的边是互不相交的。至少要选择一个顶点)。
那么最小覆盖数为|M|能否覆盖所有边呢?答案是可以。
对于任意的一个点,要么孤立,要么与匹配M上某一点相连(不可能与其他点相连,否则匹配可以增广)。
我们已经知道匹配内部的边最多只会有一端与外界相连,那么我们选择与外界相连的这个点。即可覆盖所有边。
孤立点没有边就不需要考虑。
所以最小覆盖数等于最大匹配数。
对于第二个结论:
最大独立集是点数最多的点集,此点集内部的点两两都不相交。
首先点有两种,一种是孤立的点,肯定在独立集 中。
另外一种是匹配中的点或和匹配相连的点。
对于这种点,我们要选出最多的两两不相交的点。
由于匹配的定义,匹配内部的边是没有交点的,所以每条边可以单独考虑。
对于匹配的一条边而言,只有一端连了多个点,那么这多个点肯定是两两不交的(因为在同一集合中)。我们只要除去这一个点,剩下的点就一定可以再独立集中。
有人可能会想,如果这个点A连接的某个点B,与另一个匹配边的点C相连,那么会不会有连接的情况。
点B所连接的另一个匹配边也只会有一端与外界相连,这个时候我们只要除去点C,就可以保证两两独立了。
如果某个匹配没有与外界连边,那么两个点也是要除去一个的,因为这两个点本身就是相连的,只能取一个。
所以我们最终得到的最大独立集就是点的总数减去匹配数|M|。
对于第三个结论。
有向图的最小路径覆盖,是令某个点只属于某一条路径,求最小的路径覆盖所有的点。
首先如果有n个孤立的点,我们需要n条路径进行覆盖。
每两个点连接(实际上是两部分进行合并),只要能消除一个孤立点,那么路径数就减1.对于每个点只能消除一次。所以用二分匹配得出来的就是可以消除的孤立点的个数。
所以最小路径覆盖=顶点数 - 最大匹配数
二分图的一个充要条件是:点数大于2,且不存在奇数长度的环。
至于模板
HK算法的板
http://blog.csdn.net/u012936765/article/details/47054627
匈牙利算法的板
http://blog.csdn.net/u012936765/article/details/44732173