所谓二分图,即对于一个图来说,如果其顶点能为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点,则这个图就是二分图,如下图所示的图就是一个二分图:
图(1)
匹配:在图论中,一个匹配(matching)是一个边的集合,其中任意两条边都没有公共顶点。如下图(2)红色边就是图(1)的一个匹配:
图(2)
对于一个匹配中,还存在四个概念:匹配点、非匹配点、匹配边、非匹配边。所谓匹配点,即匹配边的两个顶点,如图(2)中的顶点1和5就是匹配点,边(1,5)就是匹配边,而非匹配点和非匹配边都是匹配点和匹配边的对立,如图(2)中,顶点2、3、4、6、7、8都是非匹配点,边(2,5)、(1,7)、(3,5)、(3,6)、(4,7)、(4,8)都是非匹配边。
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。图(1)的一个最大匹配如下图(3)红色边所示:
图(3)
完全匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。图(3)就是图(1)的完全匹配。
一般情况下,对任意无权二分图,完全匹配不一定存在,但总会存在一个最大匹配。 那对于如图(1)这样的二分图,是如何得到其最大匹配的呢?这里就需要了解求二分图最大匹配问题的匈牙利算法。
首选说明两个关于匈牙利算法的概念,交替路和增广路。
交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)。对于图(2),从顶点2出发,经过顶点5,再到顶点1,再到顶点7就是一条增广路,如下图(4)所示,在这条增广路中我们把匹配点和匹配边都表示为红色,非匹配点和非匹配边表示为黑色:
图(4)
由增广路定义和图(4)可知,增广路有以下特性:(1)增广路的起点和终点必须是非匹配点;(2)增广路中非匹配边比匹配边多1。
匈牙利算法的核心就是在原始二分图中不停的找增广路,直到找不到为止,或二分图中一边的顶点遍历完。具体的实现思路有两种:DFS和BFS,即深度优先和广度优先,下面给出DFS的实现思路:
(1)对于初始二分图,全部顶点为非匹配点,全部边为非匹配边,假设其分为的2个顶点集合分别为X和Y,则从X中第一个顶点开始,寻找Y中与该顶点连接的第一个顶点,由于这个连接顶点肯定是非匹配点,所以这条增广路结束,将这两个顶点和边归为匹配点和匹配边;
(2)从X的第二个顶点接着开始找增广路,具体为,在Y中找该顶点的连接顶点,对于该连接顶点,其有两种状态
(I)如果连接顶点是非匹配顶点,则同样这条增广路结束,将这两个顶点归为匹配点,其边归为匹配边;
(II)如果连接顶点是匹配顶点,则开始走其交替路,走交替路同样有两种结果:
(a)如果在走交替路中遇到一个非匹配点,则这条增广路结束,结束之后,有一个很重要的操作,就是需要对这条增广路做“取反操作”,所谓增广路的“取反”操作,就是将这条增广路路径中的非匹配边变为匹配边,将匹配边变为非匹配边;
(b)如果在走交替路中没有遇到非匹配顶点,而且这条路径已经走完了,就从第二个顶点的下一个连接顶点再开始上述操作,直到找到一条增广路才结束。
(3)从X中下一个顶点继续第(2)操作,寻找增广路,直到没有找到增广路为止;
注:如需匈牙利算法的代码实现可访问博文点击打开链接。
根据上述匈牙利算法的思路,下面给出找出图(1)的最大匹配图(3)的过程如下所示:
上述例子也印证了匈牙利算法的核心思想就是不停的找增广路,直到找不到为止,最后得到的图就是原始二分图的最大匹配结果。但是,对于无权二分图来说,匈牙利算法只能找到全局最优匹配解,而在实际问题中具体的局部匹配关系是不是符合实际情况是不能保证的。也就是说,基于匈牙利算的二分图最大匹配只能找到全局的最大匹配数,这个最大匹配数是一定的,即使有多种最大匹配情况,但所得的最大匹配关系有可能并不是唯一的。
如下图所示二分图:
首先是标号为“0”的原始二分图,然后是标号为“1”的有一个匹配边的匹配;
其实是根据标号为“1”的匹配进一步找增广路得到的匹配边为2的匹配;
再接着是,根据标号为“(1)2_2”的匹配图进一步找增广路,从顶点3出发,得到三种匹配边为3的匹配,标号分别为“((1)2_2)3_1”,“((1)2_2)3_2”,“((1)2_2)3_3”;
再接着,根据匹配“((1)2_2)3_1”,“((1)2_2)3_2”,“((1)2_2)3_3”再进一步找增广路,得到如下图所示的标号分别为”(((1)2_2)3_1)4_1“,”(((1)2_2)3_1)4_2“、”(((1)2_2)3_2)4_1“、”(((1)2_2)3_2)4_2“、”(((1)2_2)3_2)4_3“、”(((1)2_2)3_3)4_1“、”(((1)2_2)3_3)4_2“最大匹配。可以看这些最大匹配中,已经出现了相同的最大匹配。
所以,通过匈牙利算法得到的最大匹配有可能不是唯一的。