【模板】二分图最大权完美匹配KM算法
KM是什么意思,详见百度百科。
总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3)。
给张图。
二分图有了边权,求最大匹配下的最大权值。
所以该怎么做呢?对啊,怎么做呢?
我也不懂啊,看的别人博客。
然而并没有将思路,只是模拟了一遍。
核心是在当两个女生都匹配到一个男生时,这两个女生只能降低一下期望值了,降低多少呢?两个妹子都在能选择的其他人中,也就是没参与这轮匹配的男生中,选择一个期望值降低的尽可能小的人。也就是再其他人中选择一个最合适的。
匹配过程用匈牙利算法。
——代码(服用时把注释去掉就好)
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = ;
int n;
int love[maxn][maxn];
//男女好感度
int ex_boy[maxn], ex_girl[maxn];
//每个男生期望值,每个妹子期望值
int match[maxn];
//记录每个男生匹配到的妹子 如果没有则为-1
int slack[maxn];
//记录每个男生如果能被妹子倾心最少还需要多少期望值
bool vis_boy[maxn], vis_girl[maxn];
//记录每一轮匹配匹配到的男生和女生 bool find(int i)
{
int j, gap;
vis_girl[i] = ;
for(j = ; j <= n; j++)
{
if(vis_boy[j]) continue; //每一轮匹配,每个男生只尝试一次
gap = ex_girl[i] + ex_boy[j] - love[i][j];
if(gap == ) //如果符合要求
{
vis_boy[j] = ;
//如果没有找到匹配男生,或者该男生的妹子可以找到其他人
if(match[j] == - || find(match[j]))
{
match[j] = i;
return ;
}
}
else slack[j] = min(slack[j], gap);
// slack 可以理解为该男生要得到女生的倾心 还需多少期望值 取最小值 备胎的样子【捂脸
}
return ;
} int KM()
{
int i, j, d, ret = ;
memset(match, -, sizeof(match));
//初始每个男生都没有匹配到女生
memset(ex_boy, , sizeof(ex_boy));
//初始每个男生期望值为0 //每个女生的期望值是与她相连的男生的最大好感度
for(i = ; i <= n; i++)
for(j = ; j <= n; j++)
ex_girl[i] = max(ex_girl[i], love[i][j]); //尝试为每个女生解决归宿问题
for(i = ; i <= n; i++)
{
memset(slack, / , sizeof(slack));
//因为要取小值,初始化无穷大
while()
{
//为每个女生解决归宿的方法是:
//如果找不到就降低期望值,直到找到为止 //记录每轮匹配中男女是否被匹配过
memset(vis_girl, , sizeof(vis_girl));
memset(vis_boy, , sizeof(vis_boy)); //找到归宿,退出
if(find(i)) break; //如果找不到,就降低期望值
//最小可降低的期望值
d = INF;
for(j = ; j <= n; j++)
if(!vis_boy[j])
d = min(d, slack[j]); for(j = ; j <= n; j++)
{
//所有访问过的妹子降低期望值
if(vis_girl[j]) ex_girl[j] -= d;
//所有访问过的男生增加期望值
if(vis_boy[j]) ex_boy[j] += d;
}
}
} //匹配完成,找出所有匹配的好感度之和
for(i = ; i <= n; i++) ret += love[match[i]][i];
return ret;
} int main()
{
int i, j;
while(~scanf("%d", &n))
{
for(i = ; i <= n; i++)
for(j = ; j <= n; j++)
scanf("%d", &love[i][j]);
printf("%d\n", KM());
}
return ;
}
拉闸,变量名改不过来了。
【模板】二分图最大权完美匹配KM算法的更多相关文章
- 二分图最大权完美匹配KM算法
KM算法二分图 KM求得二分图与普通二分图的不同之处在于:此二分图的每条边(男生女生)上都附了权值(好感度).然后,求怎样完美匹配使得权值之和最大. 这,不止一般的麻烦啊. 可以通过一个期望值来求. ...
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577
题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...
- 【二分图最大权完美匹配】【KM算法】【转】
[文章详解出处]https://www.cnblogs.com/wenruo/p/5264235.html KM算法是用来求二分图最大权完美匹配的.[也就算之前的匈牙利算法求二分最大匹配的变种??] ...
- Solution -「洛谷 P6577」「模板」二分图最大权完美匹配
\(\mathcal{Description}\) Link. 给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w( ...
- 二分图学习记 之 KM算法 二分图最大权完美匹配。
前置知识 :匈牙利算法 首先有这样一张图,求这张图的最大权完美匹配. 当然如果你不想看这些渣图的话,您可以转到 洛谷 运动员最佳匹配问题 下面我来强行解释一下KM算法 左边一群妹子找汉子,但是每个妹子 ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- hdu 3722 二分图 最优完备匹配 KM算法
这题只要想到是最优完备匹配就行了: 题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数: 问如何匹配得出最大值: 思路:建图,套模板. 代码: # ...
随机推荐
- JS入门(二)
关于运算符: js中判断运算符跟数学的运算符基本差不多,就是大于>,小于<,大于等于>=,小于等于<=,等于==,不等于!=,全等于===:可以看出来,跟我们印象中的判断运算符 ...
- JavaScript中冒泡排序
在我大学的时候,就已经接触到过很多的排序方式,只是那时候听得还很懵懂,大概知道这么个东西,也对冒泡排序有点印象,但真要我写,我是写不出来的.最近,在回顾js基础的时候,又接触到了冒泡排序.于是,就把冒 ...
- 解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
使用VS2015重复编译运行会发现系统运行缓慢甚至卡死,打开windows任务管理器可以发现CPU已经飙到了100%, VBCSCompiler.exe进程出现多个实例并且占用了大量CPU. 解决方案 ...
- UI状态控制
if(BillBaseStatusEnum.ADD==this.editData.getBaseStatus()){ this.btnSave.setEnabled(true); this.btnSu ...
- 用Use Case获取需求的方法是否有什么缺陷,还有什么地方需要改进?
一.用例解释 用例是一种在开发新系统或者软件改造时捕获潜在需求的技术.每个用例提供了一个或多个场景,该场景揭示了系统是如何同最终用户或其它系统交互的,从而获得一个明确的业务目标.用例要避免技术术语,取 ...
- Android开发使用的常见第三方框架
1.SlidingMenu 官网:https://github.com/jfeinstein10/SlidingMenu 网友使用:http://blog.csdn.net/yangyu2012122 ...
- Python模块的动态加载机制
Python在运行环境初始化中,就将sys module加载到了内存中, 实际上,Python是将一大批的module加载到了内存中.但是为了使local名字空间能够达到最干净的效果,Python并没 ...
- 笔记本win10关机异常解决
自从使用了win10 以后,小编已经情不自禁的爱上了她——迄今为止最NB的windows系统 但令人头疼的问题也随之而来,前几天购置了一款三星的SSD固态硬盘,马上就装了win10,某天晚上关机以后发 ...
- volatile关键字和synchronized关键字
volatile关键字: 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性. synchron ...
- SqlServer转换为Mysql
昨天顺利把MySQL成功安装后,正准备着手把原来项目中的SQL SERVER数据库改为MYSQL数据库,可大量的表结构和表数据如要手动写,那就...... 接下来就是各种百度.谷歌.问先驱等,可得到的 ...