【模板】二分图最大权完美匹配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个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数: 问如何匹配得出最大值: 思路:建图,套模板. 代码: # ...
随机推荐
- 《深入理解Java虚拟机》学习笔记之内存分配
JVM在执行Java程序的过程中会把它所管理的内存划分若干个不同的数据区域,如下图: 大致可以分为两类:线程私有区域和线程共享区域. 线程私有区域 程序计数器(Program Counter Regi ...
- Eclipse多个console的使用
我们在使用Eclipse开发服务器端和客户端时,经常需要同时运行服务器端和客户端,以便联调运行情况.而我之前一般有两种做法: 使用Java的命令行模式运行,但这种做法通常比较麻烦,因为要使用大串的cl ...
- jquery与js的区别与基础操作
一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...
- KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-body-res
koahub body res Format koa's respond json. Installation $ npm install koahub-body-res Use with koa v ...
- 手机端rem如何适配_rem详解及使用方法
什么是rem 在我看来,rem就是1rem单位就等于html节点fontsize的像素值.所以改变html节点的fontsize是最为关键的一步.根据手机宽度改变相对大小就可以实现自适应了,就不用什么 ...
- 使用Git将本地仓库与GitHub远程仓库相关联
这篇文章详细讲解了如何生成SSH,并链接到GitHub,123..... 1.如果你的GitHub里面没有仓库,就自己生成一个,如图所示 2.如果你有自己仓库,想在电脑本地新建一个,你需要将GitHu ...
- 一切app源于生活 用于生活 一个利于生活的app——利生活
现在的app软件可以说 各行各业都基本达到饱和阶段 因为智能手机时代让我们的世界缩小了十倍百倍甚至千倍,我们可以足不出户知天下可以足不出户的去购物. 既然app利于生活 那么今天我所要开发的一个app ...
- 源码分析Android Handler是如何实现线程间通信的
源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...
- SQL AlawaysOn 之四:故障转移集群
声明,故障转移集群,仅安装在SQL服务器中,域服务器不能和SQL服务器一起加入集群. 1.添加故障转移集群,下一步 2.安装 3.在域控制服务器上的管理工具里打开故不障转移集群管理器,选择创建集群 4 ...
- Swift应用案例 2.闭包入门到精通
本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...