【模板】二分图最大权完美匹配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个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数: 问如何匹配得出最大值: 思路:建图,套模板. 代码: # ...
随机推荐
- Sublime Text 3 (Build 3126) 最新注册码
Sublime Text 作为程序员开发神器,听说最新版更新了 并且增加了不少新特性.马上到官网下载了最新版 Sublime Text 3 3126 使用了下,反应速度比以前的确更快了.随手找了几个S ...
- php弱类型语言中的类型判断
1.php一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较.PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0. 例如:123abc转换后 ...
- TypeScript 优秀开源项目大合集
TypeScript出来有段时间了,也冒出了很多用TypeScript开发的优秀开源项目,搜寻了一些基于TypeScript项目,分享给大家: https://github.com/brookshi/ ...
- if(){}else 语句的正确写法以及它的嵌套使用
if(一个返回bool值的条件表达式) { 程序块 } else{} 它的执行过程我们可以通过一个程序来了解 static void Main(string[] args) { ) // 条件1 { ...
- 1856: [Scoi2010]字符串
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 847 Solved: 434[Submit][Status] D ...
- Rabbitmq 性能测试
背景: 线上环境,出了一起事故,初步定位是rabbitmq server. 通过抓包发现,是有多个应用使用同一台rabbitmq server.并且多个应用使用rabbitmq的方式也不一样.发现有以 ...
- python rsa 加密解密 (编解码,base64编解码)
最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...
- C#对委托的初步理解理解
作为新手对委托的学习: 1.定义委托:委托实际上是一个类,在定义委托前就知道了方法的返回类型和方法的参数类型(可以把委托理解为只知道方法的返回类型和方法的参数类型,不知道方法体) public de ...
- 关于Tarjan(1)
众所周知, 求有向图的强连通分量的Tarjan算法是以其发明者Robert Tarjan命名的.Robert Tarjan还发明了求双连通分量的Tarjan算法,以及求最近公共祖先(LCA)的离线Ta ...
- SQL AlawaysOn 之五:ISCSI共享磁盘
用于存放SQL数据库 1.安装服务 2.安装完成后要求重启计算机.添加该功能要配置计算机,如果是正式服务器,那种不能关机太久的服务器,请慎用. 重启之后看到文件和储存服务,击击进去 3.看到ISCSI ...