最大匹配与二分图建图概述

一:关于二分图最大匹配的两个定理:


1:最大匹配数 + 最大独立集 = n + m(n,m为二部图两部分的个数)
2:二分图的最小覆盖数 = 最大匹配数

3:最小路径覆盖 = 最大独立集


最大独立集是指求一个二分图中最大的一个点集,该点集内的点互不相连。


最小顶点覆盖是指 在二分图中,用最少的点,让所有的边至少和一个点有关联。


最小路径覆盖是指一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括0


关于二分图最大匹配算法:http://blog.csdn.net/no_retreats/article/details/7854091


常见的建图模型:(以下是参照其他资源小结的)

模型一:行列匹配法

    

1 0 1
0 1 0
1 0 0
      如上图所述是一个3*3的矩阵,其中1表示有敌人,0表示没有敌人。我们现在有多支箭,而且每支箭能够杀死一行或者一列的敌人,问题是我们要杀死所有的敌人至少需要多少支箭?

      初初看来和二分图是没有什么联系,不过我们可以试试换个角度去思考问题,我们想要杀死敌人是不是只要有箭经过他就行了是吧,也就是说所有的敌人被箭覆盖过就行了。嗯,没错,就是覆盖,最小顶点覆盖。既然我们要杀的是敌人,那么我们的点就应该是敌人的位置,只要有箭经过敌人的位置,那敌人就被我们杀死了有木有。所以我们要依据点来建图,将点的横坐标看成是二分图的X部分,纵坐标看成是二分图的Y部分。由上图可知敌人的位置在((1,1),(1,3),(2,2),(3,1)),因此我们就用坐标的横纵坐标来见二分图了,其中用边相连的边即为敌人所在的点了。

   ,一个二分图的最小顶点覆盖就是要找到最少的边把所有的顶点覆盖,正好符合这个题的要求,上面还给出了一个性质,即二分图的最小顶点覆盖是等于二分图的最大匹配。所以我们只需要对上面的那个二分图就最大匹配就行,这样把原本的问题转变的很简单了


模型二:黑白染色法

1 0 1
1 1 1
0 0 1
如上图还是一个3*3的矩阵,现在的问题就是让你把图中的1变为0,而且一次最多只能修改相邻的两个,问至少需要多少次的修改才能把所有的1修改为0?似乎用贪心,DP都派不上用场,当然在这里提出是要用二分图最大匹配来求解了,这里的关键是如何建图?既然是每次只能拿相邻的两个,是两个,正好我们匹配的时候也是找两个进行匹配,这就是这个问题和最大二分图匹配问题相联系的地方。但是每个点能和他四周的四个点匹配,那么我们怎么把所有的点分成来那个部分呢? 一个解决办法就是要把第i个点放到第一部分,第i个点周围的四个点放到第二部分,再把这四个点周围的16点放到第1部分
有了这样的思想,我们只需对原图做这样的改动:黑白染色使四周和中间的颜色不同。

                                                           最大匹配与二分图建图概述_第1张图片

 
图中黑白的意思是就是把点分类,图里的1,2,3,4,5,6表示的就是上面那个0,1图的1的个数
然后建图,把相邻的点相连,比如说1和2 2和3 。。。。。。。

                                                           最大匹配与二分图建图概述_第2张图片

 
 
 然后要把所有一改为零,也就是要对每个点都操作,每个点都要有,那不就是最小顶点覆盖吗?嗯,是的,还是最小顶点覆盖。
 




你可能感兴趣的:(最大匹配与二分图建图概述)