首页 > 编程语言 > 详细

KM算法详解+模板

时间:2016-03-11 10:09:28      阅读:171      评论:0      收藏:0      [点我收藏+]

 http://www.cnblogs.com/wenruo/p/5264235.html

KM算法用来求二分图最大权完美匹配。

此文配合该博文服用更佳:http://blog.csdn.net/dark_scope/article/details/8880547

 

现在有N男N女,男生和女生每两个人之间有好感度,我们希望把他们两两配对,并且最后希望好感度和最大。

技术分享

怎么选择最优的配对方法呢?

首先,每个妹子会有一个期望值,就是与她有好感度的男生中最大的好感度。男生呢,期望值为0,就是,,,只要有一个妹子就可以啦,不挑~~

这样,我们把每个人的期望值标出来。

技术分享

然后,开始配对。配对方法:男女两人的期望和要等于两人之间的好感度。每一轮匹配,无论是否成功,每个男生只会被尝试匹配一次!

匹配过程:

第一轮匹配:

============================

女1:选择了男3(此时女1--男3)

女2:也想选择男3,男3已经在该轮匹配过了,女2无其他合适选择,匹配失败。

===============================

这一轮参与匹配的人有:女1,女2,男3。

怎么办???很容易想到的,这两个女生只能降低一下期望值了,降低多少呢?两个妹子都在能选择的其他人中,也就是没参与这轮匹配的男生中,选择一个期望值降低的尽可能小的人。也就是再其他人中选择一个最合适的。

比如:女1选择男1,期望值要降低1。 女2选择男1,期望值要降低1。 女2选择男2,期望值要降低2。

于是,只要期望值降低1,就有妹子可能选择其他人。所以妹子们的期望值要降低1点。

同时,刚才被抢的男生此时非常得意,因为有妹子来抢他,与是他的期望值提高了1点(就是同妹子们降低的期望值相同)。

与是期望值变成这样(当然,不参与刚才匹配过程的人期望值不变)

技术分享

第二轮匹配:

============================

(女1已经在第一轮匹配完成了,女1--男3)

女2:选择男1。(此时女1--男3,女2--男1)

女3:选择男3,男3已经有女1了,于是女1尝试换人,换到男1,男1已经被在这一轮被尝试匹配过了。于是女1换人失败,这一轮匹配失败。

============================

再一次改变期望值。

这次三个女生都参与了匹配,男1和男3参与匹配。女生尝试换人,于是期望值降低1。参与匹配的男生期望值增加1。

技术分享

第三轮匹配:

============================

上一轮女1和女2是匹配完成的。(此时女1--男3,女2--男1)

女3:选择男3,男3的当前对象女1尝试换人,换到了男1,但是男1已经有女2了,于是女2再尝试换人,换到了男2,于是女2--男2,女1--男1,女3--男3

匹配成功!!!撒花~~

============================

虽然不停换人的过程听起来很麻烦,但其实整个是个递归的过程,实现起来比较简单。比较复杂的部分就是期望值的改变,但是可以在递归匹配的过程中顺带求出来。

 

模板(带详细注释)(稍后上……

 

KM算法详解+模板

原文:http://www.cnblogs.com/wenruo/p/5264235.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!