前言
其实这是一个很玄学的算法,我也不是很懂。但是慢慢地写,就慢慢地懂了。
例子
我们先看到这样一个例子:
现有n个男生和n个女生,每一个女生对于一个男生都有一个期望值。现在想知道期望值最大是多少。
算法
那么显然,我们需要一种算法来完成这个任务,KM腾空出世!
在此之前,我们需要了解一些东西:
前置知识
期望值:女生连的边中边权最大的值,称之为女生的期望值
l(x)+l(y)>=w(i,j)
当l(x)+l(y)=w(i,j)时,是M图的完美匹配!
过程
原则
- 能换就换(思想很像匈牙利求二分图最大匹配)
做法
- 对于每一个妹子,选择她最喜欢的男生
- 如果无法达到以上要求,前往4
- 如果可以,递归修改她人男友.前往1
- 所有访问过的女生值域减去
- 访问过的男生值域加上
代码实现
复杂度及优化
以上代码的复杂度为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)
例题
时间: 2024-10-12 03:05:10