文章作者:ktyanny 文章来源:ktyanny 转载请注明,谢谢合作。
话说昨晚看了下师兄今天下午会讲解的二分匹配,囧了好久,放弃了就爬到床上去睡一大觉。今早早早起来就抱着本《新编实用算法分析与程序设计设计》跑去图书馆。看了一个小时,精疲力竭,总算由一个比较感性的认识了。但是还在纠结中,下午的讨论会一定要好好研究研究二分匹配。
1、二分图和匹配的基本概念
匹配:把图中没有公共端点的一组线叫做匹配 ,比如说下图中的(v2, v3)、(v5, v7)、(v6, v10)就代表一种匹配方案。匹配数为3。
官方的匹配定义:设G=[V, E]是一个无向图,M为U的子集,是G的若干条边的集合,如果M中的任意两条边都没有公共端点,就称M是一个匹配。
二分图:G的顶点集合V分成两部分X与Y,G中每条边的两个端点一定是一个属于X,而另一个属于Y,因此二分图亦可简记为G = (X, Y; E)。
注意:二分图继承了图的一般性质的同时,更有一些特殊的性质,其最大匹配较之一般图的最大匹配 较为简单,也有更广泛的适用性。
2、怎样判别二分图
二分图的邻接矩阵一般有如下形式:
事实上,采用邻接矩阵的形式来判断是否为二分图的方法是很不方便而且不可靠的,那么不得不摒弃这个方法。好在我们伟大的祖先已经给出了更加实用的定理来判别二分图。
定理:当且仅当无向图G的每一个回路的长度均为偶数时,G才是一个二分图。如果无回路,相当于任一回路的长度为0,0视为偶数。
证明很简单,我就不在这里赘述了。
3、增广路径 (二分图的最大匹配)
盖点:设M是二分图的一个匹配,将M中的边所有关联的顶点称为盖点,其余就叫做未盖点吧。
交错轨:若一条路径上属于M的边和不属于M的边交替出现,则称该路径为交错轨。
增广路径: 若路径p是一条起始点和结束点都是未盖点的交错轨,则称p为关于M的增广路径。
4、增广路径的性质
1)一条关于M的增广路径的长度必为奇数,且路上的第一条边和最后一条边都不属于M。
2)对于一条关于 M的增广路径p,将M中属于p的边删去,将p中不属于M的边添加到M中,所得到的边集合记为M(mod)p,则M(mod)p比M增加一条匹配边。
3)M为G的一个最大匹配当且仅当不存在关于M的增广路径
5、利用增广路径寻找最大匹配思想
初始时,置M为空集。然后反复在二分图中找一条关于M的增广路径p,并用 M(mod)p代替M,直到二分图中不存在关于M的增广路径,最后得到的匹配M就是G的一个最大匹配。
6、匈牙利算法
首先得提一下Hall定理
Hall定理: 对于二分图G = (x, y; e),存在一匹配M,使得x的所有顶点关于M饱和的充分必要条件是:对x的任一子集A,和A邻接的点集为p(A),恒有:| p[A] | >= | A | 。(证明部分自己参考相关书籍)
匈牙利的具体实现方法是构造一棵匈牙利树。