KM算法求完美匹配下的最大权匹配:在一个二分图中,左顶点集为A,右顶点集为B,现对于每组左右连接AiBj有权wij,求一种匹配使得所有wij的和最大。
这里的完美匹配:在二分图中,X点集中的所有点都有对应的匹配或者是Y点集中所有的点都有对应的匹配。
算法原理:
1.若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。在算法执行过程中的任一时刻,对于任一条边(i,j),A[ i ]+B[j]>=w[i,j]始终成立。
2.在求当前相等子图的完美匹配失败时,需要修改顶标值扩大相等子图,具体如下:
失败的原因是因为没有找到增广路(见匈牙利算法中的M-增广路),而是得到一颗交错树,这颗树的叶子节点都是A中的节点。我们把交错树中的A顶标都减去d,B顶标都加上d,有:
a.两端都在交错树中的边(i,j),A[i]+B[j]的值没有变化。也就是说,它原来属于相等子图,现在仍属于相等子图。
b.A端在交错树中,B端不在交错树中的边(i,j),它的A[ i ]+B[j]的值有所减小。也就说,它原来不属于相等子图,现在可能进入了相等子图,因而使相等子图得到了扩大。
在这两种情况中,最后加入相等子图中的是b情况。
3.d值的求解,为了使A[i]+B[j]>=w[i,j]始终成立,且至少有一条边进入相等子图,d应该等于:
min{A[i]+B[j]-w[i,j] | Ai在交错树中,Bi不在交错树中}。
算法流程:
1.给每一个顶点一个标号(顶标),顶标初始化A为与该顶点相关联的边的最大权值,B为0。
2.用匈牙利算法寻找完备匹配;