KM算法

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.用匈牙利算法寻找完备匹配;

3.若未找到完备匹配则修改可行顶标的值;
4.重复(2)(3)直到找到相等子图的完备匹配为止;
 
对代码进行模拟,会较好的理解KM算法!

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/07/19/2599835.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值