1. 二分图:在一个二分图中,所有的顶点都可以分为两个不相交的集合U和V,两个集合大小不一定相等,但每条边都连接两个集合中各一个顶点。
例如:
2. 二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是G的一个匹配。
(1)如果一条边e在M中,我们称边e是匹配的,否则称边e为自由的。
(2)如果一个顶点v和一条匹配的边关联,则称该点v是匹配的,否则称为点v为自由的。
3. 二分图的最大匹配:匹配M的规模定义为M中所有匹配边的数量,一个二分图的最大匹配是具有最大规模的匹配。
4. 二分图的完全匹配:一个二分图中的所有顶点被匹配,则称该二分图是完全匹配。
5. 增广路径:在一个无向图G=(V,E)中给定一个匹配,若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配的边和未匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。
例如:
子图M的匹配边集:M{(1,3),(2,5)}
点1,2,3,5是匹配的,点4和6是自由的;边(1,3)和(2,5)是匹配的,边(1,4)和(3,6)是自由的。
则有路径6-3-1-4是关于M的一条增广路径。
6. 拓展:
此时,我们将M中的边(1,3)去掉,增加边(1,4)和边(6,3),得到图M':
可以看到,图M‘匹配数增加了1,即P(M’)=P(M)+1,其中P(x)为二分图x的匹配数。
由此我们得到了一个规律:
一般来说,我们可以通过构造一条增广路径来扩大当前的匹配,这条路径一头连接U中的自由顶点,另一头连接V中的自由顶点,且路径上的边交替出现在E-M和M中。也就是说,路径上的第一条边不属于M,第二条边属于M,依此类推,直到最后一条不属于M的边。由于增广路径的长度总是奇数,把奇数边加入M,偶数边从M中去除,就可以生成一个新的匹配,该匹配比M多一条边。
因此,对于增广路径P,我们可以得出下面的三个结论:
(1)P的长度必定为奇数,且第一条边和最后一条边都不属于M。
(2)P经过取反操作后可以得到一个更大的匹配M‘。
(3)M为G的最大匹配当且仅当不存在相对于M的增广路径。
由此,就得到了一个构造二分图最大匹配的通用方法:从某种匹配(例如空集合)开始,求出一个增广路径,并沿着该路径对当前匹配进行增广,如果无法再找到增广路径,算法终止并返回最后匹配,该匹配就是最大的。
这种增广路径求二分图最大匹配的算法就叫做匈牙利算法(Hungary Algorithm),是由匈牙利数学家Edmonds于1965年提出的!
7. 算法框架:
(1)置M为空;
(2)求出一条增广路径,通过取反操作获得更大的匹配M’代替M;
(3)重复(2)操作知道找不出增广路径为止;