匹配
将需要配对的两种对象分别作为 X、Y,匹配常如资源匹配和工作安排等,求配对关系或者给顶点和边赋权,求某种条件下的最优分配问题。可以用而二分图来解决匹配的问题。
二分图
二分图又称作偶图,是图论中一个特殊的模型。设 G =(V,E)是一无向图,若顶点 V 可以分割为两个互不相交的子集 A 和 B 且图中每条边(i,j)所关联的两个顶点 i 和 j 分别属于这两个不同的顶点集,则称 G 是一个二分图。其充要条件是:图 G 中至少存在两个点,且图中所有回路的长度均为偶数。简单来说,就是顶点集 V 可分割为两个互不相交的子集,且图中每条边依附的两个顶点都分别属于这两个互不相交的子集,且两个子集内的顶点不相邻。当图中的顶点分为两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连时,此时是一特殊的二分图,称为完全二分图。
二分图匹配
如果 E 的子集 M 中任意两条边都没有公共端点,则 M 称为一个匹配。边数最多的匹配称为最大匹配,如果 X 中顶点全都出现在 M 中,则称为 X-完全匹配。若个匹配 M 既是 X-完全匹配 又是 Y-完全匹配,则称 M 是完全匹配。对最大匹配和完全匹配的寻找和判定,有广泛的应用背景。
如工作安排问题:课程和教师的一一安排。可抽象为一个二分图 G = ,其中 U 是教师的集合,V是课程的集合,E 中的边 表示某位教师 U 可以上课程 V。求最大匹配,即使得每门课都有老师教,有学生上。最大匹配可用匈牙利算法。
匈牙利算法
- 任取一个匹配 M(可以是空集或者只有一条边)。
- 令 S 是尚未匹配的点(非饱和点)的集合。
- 若 S 为空,则 M 已是最大匹配,算法结束。否则执行第四步。
- 从 S 中取出一个非饱和点 u 作为起点,从起点开始走交错路 P(即接下来走的路径一条在匹配 M 中一条不在匹配 M 中,交替走两种类型的路径)。
- 如果 P 的终点也是非饱和点(即 P 是一个增广路),则令 M 与 P 异或并赋值给 M,回到第三步。
- 如果此时 P 都不是增广路,则将点 u 从 S 中去掉,再执行第三步。
上面的教师课程问题:u1 ~ u6 为教师,v1 ~ v6 为课程。
- 当前的匹配 M1 为 {(u2,v6),(u3,v1)},未匹配的点集 S1 为{u1,u4,u5,u6}。选择 u1 作为起点。选出增广路 P1 为{(u1,v1),(v1,u3),(u3,v3)},如下图:
将 M1 与 P1 异或,得到 M2 为{(u1,v1),(u2,v6),(u3,v3)},此时未匹配的点集 S2 为{u4,u5,u6}。
- 选择 u4 作为起点,选出增广路 P2 为{(u4,v2)}。再将 P2 与 M2 异或,得到 M3 为{(u1,v1),(u2,v6),(u3,v3),(u4,v2)},此时未匹配的点集 S3 为{u5,u6}。
- 选择 u5 为起点,选出增广路 P3 为{(u5,v3),(v3,u3),(u3,v1),(v1,u1),(u1,v4)}。将 P3 与 M3 异或,得到 M4 为{(u5,v3),(u2,v6),(u3,v1),(u1,v4),(u4,v2)} ,此时未匹配的点集 S4 为{u6}。
- 选 u6 为起点,选出增广路 P4 为{(u6,v1),(v1,u3),(u3,v3),(v3,u5),(u5,v5)}。将 P4 与 M4 异或,得到 M5 为{(u5,v5),(u2,v6),(u1,v4),(u4,v2),(u3,v3),(u6,v1)} 。即得到一个最大匹配,也是一个完全匹配。