在竞赛中,围绕二分图而展开的题目层出不穷,需要从根本上理解问题.
首先,需要了解二分图的概念,至于二分图,通俗的说,就是顶点可以分成两个部分,每个部分之内不能有边的图,相当于男女(排除gay啊).一定要深刻理解下.
对于二分图的一些浅显易懂的性质:
二分图的色数是肯定为2的,"二分图"吗,只要两边染色就好啊,那么,也提供了一个判定的方法,离散书上的,就是奇偶染色,矛盾了就必须不是,poj2492同性恋
两边染色就说明一定不存在奇环,你想啊,奇环上就出矛盾了,然后要不没有环,要不有环,环上又必须满足啊,所以必须两色.一般情况,题里说了不存在奇环一定就是和二分图有关.
那么,如何判断二分图呢,一种方法是很直观的看出来,比如说男女一类的,剩下的就是奇环了,就和whu网赛的A题一样,由于n=15,直接枚举两边就好了.
下面再说下什么叫匹配,以及和匹配相关的一些概念,匹配就是一些边的集合,这些边没有公共顶点,举个例子,就是飞机场有n个驾驶员,有一部分驾驶员之间是互相认识的,飞机需要两个互相认识的驾驶员才能起飞,一个驾驶员只能上一个飞机,求能起飞的最大飞机架数,那么我们只要让认识的飞行员之间相互连边,然后就成了选出最多的不相交的边了,就成了最大匹配,那么由于这个图是一般图,需要用带花树算法,很复杂,应用就不多做要求,但是,如果人里面有一些正驾驶,副驾驶,飞机需要一正一副而且认识才能起飞,显然就成为了一个二分图的最大匹配问题,就是下面要介绍的.
二分图匹配众所周知的解法是网络流,但是这里就不多说,讲网络流的时候再讨论,最朴素的做法是匈牙利做法,实际上这个算法非常深奥,但是由于很好写,所以很多人就不求甚解的记忆下来,没什么用.下面讲下我的理解:
首先,明确几个概念,在图里面,有一些点是和匹配的边相关联的,我们称为盖点,剩下的点叫非盖点,然后我们说下怎么把匹配增加的方法,就是增广路法,所谓增广路,就是连接两个非盖点的边其中非盖点和盖点交替出现,那么,显而易见,增广路的长度必为奇数,设为2*k+1,其中必有k条边匹配,k+1条边未匹配,那么把他们互换,就得到了k条边未匹配,k+1条边匹配,匹配数增加了1.
图1
图2
图1是我给出的二分图中的一个匹配:[1,5]和[2,6].图2就是在这个匹配的基础上找到的一条增广路径:3->6->2->5->1->4.我们借由它来描述一下二分图中的增广路径的性质:
对于增广路径还可以用一个递归的方法来描述.这个描述不一定最准确,但是它揭示了寻找增广路径的一般方法:
"从点A出发的增广路径"一定首先连向一个在原匹配中没有与点A配对的点B.如果点B在原匹配中没有与任何点配对,则它就是这条增广路径的终点;反之,如果点B已与点C配对,那么这条增广路径就是从A到B,再从B到C,再加上"从点C出发的增广路径",并且,这条从C出发的增广路径中不能与前半部分的增广路径有重复的点.
然后匈牙利算法基本就成型了,但是要完成匈牙利算法,还需要一个重要的定理:
如果从一个点A出发,没有找到增广路径,那么无论再从别的点出发找到多少增广路径来改变现在的匹配,从A出发都永远找不到增广路径.假设能找到,早找到了.
初始时最大匹配为空
for 二分图左半边的每个点i
do 从点i出发寻找增广路径,如果找到,则把它取反(即增加了总了匹配数).
二分图匹配还有一个更快的HK算法,大家感兴趣可以学习http://hi.baidu.com/czyuan_acm/blog/item/cd482e35d3947e1890ef3919.html
下面推荐一些二分匹配的题目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1274
http://acm.pku.edu.cn/JudgeOnline/problem?id=1469
http://acm.pku.edu.cn/JudgeOnline/problem?id=2239
http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1253
http://acm.pku.edu.cn/JudgeOnline/problem?id=2536
都是裸的题,但是当大家简单的复制粘贴的时候千万不可得意,一定要理解.做的时候要想下,每次的匹配究竟代表了什么,为什么是匹配.
下面介绍下顶点覆盖的问题,所谓顶点覆盖,就是选择一些顶点,然后所有边,都至少有一个顶点在那些顶点里(不同支配集),一般图的顶点覆盖是NP难的,所谓最小覆盖,就是假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边,如下图:
下面证明二分图的最大匹配等于最小覆盖:
用到了组合数学上的konig定理