KM算法萌新讲解篇
KM算法
首先了解问题:也就是最大权值匹配;
二分图里,边带了权值,求整幅图里匹配最大/最小的权值
因为接触匈牙利算法的时候看的是找对象系列的博文,所以也自己写一发找对象的博文吧;
算法背景:
信息学院计算机某班级有5位玉树凌风的男子:小诸,小包,小许,小应,小章;
外语学院英语系某班级有5位国色天香的女子:小四,小雨,小美,小丽,小英;
名称不重要!强行变成X,Y,233333
然后5位男子对5位女子都有一个好感度,见表;
|
y0 |
y1 |
y2 |
y3 |
y4 |
|
|
x0 |
4 |
1 |
6 |
2 |
3 |
|
x1 |
5 |
0 |
3 |
7 |
6 |
|
x2 |
2 |
3 |
4 |
5 |
8 |
|
x3 |
3 |
4 |
6 |
3 |
4 |
|
x4 |
4 |
6 |
5 |
8 |
6 |
现在要给这几个男孩子找女朋友~使得他们所有好感度和最大。
KM算法步骤:
初始情况下把好感度都放在男子的集合上,即
LX0=6;
LX1=7;
LX2=8;
LX3=6;
LX4=8;
然后枚举X集合元素去匹配,如果匹配到的边wij=LXi+LYj,并且j还不存在配偶,那么,嘿嘿嘿,就让他们牵手~(✿◡‿◡)
比如:在枚举X集合时,X0-Y2;X1-Y3;X2-Y4;
但是,有些女孩子很受欢迎,突然到了X3,X3最喜欢Y2,而Y2已经有X0喜欢了,窝们的目的是让整个好感度最大;
那么就会有两种情况:
① :我让X0再去找一个,然后让X3-Y2;
② :我让X3另外去选,然后还是让X0-Y2;
那么窝们怎么能随随便便让男孩子另外去找一个呢,窝们其实很容易想到一个方案就是让一个男孩子去找另外一个女孩子使得好感度比原先大的好感度降低的越少,那么这样还是会让总好感度最大;
具体的方法就是窝们可以开一个差值数组代表最大的好感度和其他好感度的差;
然后每次在寻找女朋友的时候将这个差值数组进行更新;
每次扫完女孩子以后,如果没有找到心仪对象,
找到那个最小差值d
把LX数组种那些有矛盾的男孩子的值-=d;
把LY数组种那些引起矛盾的女孩的值+=d;
观察窝们说一个男孩子找到女朋友的条件是:如果匹配到的边wij=LXi+LYj,并且j还不存在配偶,那么,嘿嘿嘿,就让他们牵手~(✿◡‿◡)
这样就能保证在下次找配偶的过程中
1.LX-=d,当再次对当前有矛盾的男孩子寻找时可能一下子找到那个好感度减少最少的女孩,因为LX减少,然而LY不变,所以一旦满足条件,就返回true;
2.LY+=d,引起矛盾的那个女生还是照样引起矛盾或者在之前就被寻找过在下次寻找到时不寻找;
3.在对出现矛盾的那个女生的本来配好的男朋友进行寻找时,同理1的情况,找到那个好感度减少最少的女孩且满足情况就返回;
这样算法流程说明(个人理解):
LX的作用是维护权值减少最少,LY的作用是维护权值最大的依旧最大;
教科书术语:
(1) 令(u,v)是一个覆盖,如对于每个j,ui=max(wij),vi=0;
(2) 在Ku*v中找出一个最大匹配M。如果M是一个完美匹配,停止并将M作为最大权值匹配返回。否则,令Q是Ku*v中大小为M的一个定点覆盖。设R=Q∩X,T=Q∩Y。令e=min{ui+vj-wij,xi∈X-R,yi∈Y-T}。
(3) 对于xi∈X-R,从ui中减去e.对yi∈T,把e加到vj上,形成一个新的相等子图,转向步骤(2);
贴一发模板:
bool Findpath(int u)
{
vx[u]=1;
for(int i=1;i<=n;i++)
{
if(vy[i]) continue;
int temp=lx[u]+ly[i]-ma[u][i];
if(temp==0)
{
vy[i]=1;
if(match[i]==-1||Findpath(match[i]))
{
match[i]=u;
return true;
}
}
else if(d>temp)
d=temp;
}
return false;
} int KM()
{
memset(match,-1,sizeof(match));
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly)); for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
lx[i]=max(ma[i][j],lx[i]); for(int i=1;i<=n;i++)
{
while(1)
{
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
d=0x3f3f3f3f;
if(Findpath(i)) break;
for(int j=1;j<=n;j++)
{
if(vx[j]) lx[j]-=d;
if(vy[j]) ly[j]+=d;
}
}
}
int res=0;
for(int i=1;i<=n;i++)
{
res+=ma[match[i]][i];
}
return res;
}
KM算法萌新讲解篇的更多相关文章
- jmeter正则表达式,萌新入门篇
@@@@@@@@@@@@ 透过现象看本质 jmeter中正则表达式对我们来说,就是一个工具,他可以帮助我们做的事就是从一堆数据中截取出我们想要的字段,比如从setcookie:DERF12456DAS ...
- 萌新在线模板--keyboarder_zsq
好像马上就要出去打铁了QAQ,所以是不是要做个模板带过去也玩一玩? 那就做吧... 标题就设为萌新模板吧...各种萌新讲解对吧.... 图论 拓扑排序 最短路 最小生成树 二分匹配 强连通Tarjan ...
- Unity萌新日记—开发小技巧与冷知识(脚本篇)
在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...
- KM算法(运用篇)
传送门:KM算法---理解篇 最佳匹配 什么是完美匹配 如果一个二分图,X部和Y部的顶点数相等,若存在一个匹配包含X部与Y部的所有顶点,则称为完美匹配. 换句话说:若二分图X部的每一个顶点都与Y中的一 ...
- KM算法讲解
对于二分图,我们可以用匈牙利来求出来最大匹配,但是如果给定每条边一个权值,我们要求这张图的最大匹配最大(小)权,单纯的用匈牙利就没法解决了,当然用费用流也可以做,但是代码较长,在处理完全二分图的时候时 ...
- 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱
作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...
- KM算法(理解篇)
转载:https://www.cnblogs.com/logosG/p/logos.html(很好,很容易理解) 一.匈牙利算法 匈牙利算法用于解决什么问题? 匈牙利算法用于解决二分图的最大匹配问题. ...
- 萌新带你开车上p站(番外篇)
本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...
- KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼
感谢 http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...
随机推荐
- 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash
[BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...
- EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台
需求 传统监控行业里面,监控客户端.服务器端,设备端都在一个内网里面,搞个电脑开个监控终端,顶多再配一个NVR做一做摄像机的录像存储.上个电视墙(个人感觉这功能除了面子工程,没啥实用的,还特费电!), ...
- java之冒泡排序
//冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大 ...
- Android笔记之获取显示器宽高
原先的Display.getWidth().Display.getHeight()已废弃 推荐的获取Display宽高的方法如下 DisplayMetrics metrics = new Displa ...
- 腾讯云服务器申请免费SSL证书,实现Https。
1.首先在腾讯云的SSL证书管理中申请免费的SSL.审核速度还是挺快的... 2.按照步骤申请后,就可以下载主流web服务器的证书了.如图: 3.这里我使用的web服务器是nginx,把nginx下的 ...
- linux apache 用户认证:
root@ubuntu:/# htpasswd -c /etc/apache2/password zhangsan (-c表示要创建一个password密码文件,文件存放目录是/etc/apache2 ...
- 在windows下把Mongodb设置系统服务
把Mongodb Server 设置为系统,方便启动与停止 今天一时兴起在本地安装了下Mongodb服务,安装完后,创建了配置文件为数据库服务指明在哪里存储数据库原始文件,随即就启动了mongo se ...
- leetcode 792. Number of Matching Subsequences
Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...
- Gym - 100187A A - Potion of Immortality —— 贪心
题目链接:http://codeforces.com/gym/100187/problem/A 题解: 光题意就想了很久:在最坏情况下的最小兔子数.其实就是至少用几只兔子就一定能找出仙药(答案存在的话 ...
- 手写Future模式
根据前面我所说的Futrue模式,手写一个: 分别对应的Java代码,大家拿来参考: package FutureTest; //公共data数据接口 public abstract class Da ...