码迷,mamicode.com
首页 > 编程语言 > 详细

KM算法(二分图完美匹配)

时间:2017-12-02 19:21:08      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:算法   http   logs   alt   慢慢   原则   期望值   复杂度   任务   

前言

其实这是一个很玄学的算法,我也不是很懂。但是慢慢地写,就慢慢地懂了。


例子

我们先看到这样一个例子:
现有n个男生和n个女生,每一个女生对于一个男生都有一个期望值。现在想知道期望值最大是多少。

技术分享图片

算法

那么显然,我们需要一种算法来完成这个任务,KM腾空出世!

 

在此之前,我们需要了解一些东西:

前置知识

期望值:女生连的边中边权最大的值,称之为女生的期望值

l(x)+l(y)>=w(i,j)

当l(x)+l(y)=w(i,j)时,是M图的完美匹配!

过程

    原则

  • 能换就换(思想很像匈牙利求二分图最大匹配)

    做法

  1. 对于每一个妹子,选择她最喜欢的男生
  2. 如果无法达到以上要求,前往4
  3. 如果可以,递归修改她人男友.前往1
  4. 所有访问过的女生值域减去
  5. 访问过的男生值域加上

代码实现

 

复杂度及优化

以上代码的复杂度为O(n^4)

有一些优化可以使代码复杂度降为O(n^3),由EK提出

显然,每一次修改,我们都不停地在计算l(x)+l(y)-w(x,y),不妨设一个变量slack表示l(x)+l(y)-w(x,y),那么显然,我们每一次查询就从O(n^2)变成了O(n),每一次修改的复杂度为O(1)

例题

 

KM算法(二分图完美匹配)

标签:算法   http   logs   alt   慢慢   原则   期望值   复杂度   任务   

原文地址:http://www.cnblogs.com/cj-gjh/p/7954895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!