参考:http://dsqiu.iteye.com/blog/1689505
1.二分图
二分图是这样的图:它的顶点可以分成两个不相交的集合,使得同一集合中的点没有边相连。
易知:任何无回路的的图均是二分图。
2.二分图的最大匹配
给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。 选择这样的子集中边数最大的子集称为图的最大匹配问题 ( maximal matching problem )
3.匈牙利算法(算法的证明在http://www.cnblogs.com/qiufeihai/archive/2012/01/11/2319800.html)
若 P 是图 G 中一条连通两个未匹配顶点的路径,并且属于 M 的边和不属于 M 的边(即已匹配和待匹配的边)在 P 上交替出现,则称 P 为相对于 M 的一条增广路径。( M 为一个匹配 )
由增广路的定义可以推出下述三个结论:
1-P 的路径长度必定为奇数,第一条边和最后一条边都不属于 M 。
2-将 M 和 P 进行异或操作( 去同存异 )可以得到一个更大的匹配M’。
3-M 为 G 的最大匹配当且仅当不存在M的增广路径。
算法轮廓:
(1)置 M 为空
(2)找出一条增广路径 P,通过异或操作获得更大的匹配 M’代替 M
图1从3出发找到一条增广路,1-6-2-5-1-4,然后将原本已匹配的两条边 2-6、1-5 设为未匹配,而把没有匹配的三条边 3-6、2-5、1-4 设为匹配。
(3)重复(2)操作直到找不出增广路径为止
彻底理解增广路查找方法
1.总是从X集的未匹配点出发,寻找匹配点或者未匹配点,如查找到未匹配点则该增广路终止,否则以该点的增广路不存在。
2.每次查找增广路都是在之前形成的匹配(上面步骤3中异或后的匹配)的基础上进行延伸的,也就是查找匹配点总是在匹配M中,其实就是用起点和终点两个未匹配点将得到匹配的边尽可能的连接起来的增广路,这样增广路长度就延长了,当然也可以是直接就是以两个个未匹配点的边(就直接添加进匹配中)。总而言之,每次扩充匹配不是通过延伸增广路径就是新增增广路径(当然长度为1)。
╔
时间空间复杂度
时间复杂度 邻接矩阵:最坏为O(n^3) 邻接表:O(mn) 空间复杂度 邻接矩阵:O(n^2) 邻接表:O(m+n)
╝