【模板】二分图最大权完美匹配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个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数: 问如何匹配得出最大值: 思路:建图,套模板. 代码: # ...
随机推荐
- Hibernate一级缓存(基于查询分析)
首先我们应该弄清什么是hibernate缓存:hibernate缓存是指为了降低应用程序对物理数据源的访问频次,从而提高应用程序的运行性能的一种策略.我们要将这个跟计算机内存或者cpu的缓存区分开. ...
- select函数的用法
首先介绍阻塞方式与非阻塞方式: 阻塞方式(block),就是进程或是线程执行到这些函数时必须等待某个事件的发生.如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 非阻塞方式(non-block ...
- SpringCache缓存初探
body,table tr { background-color: #fff } table tr td,table tr th { border: 1px solid #ccc; text-alig ...
- 查看iis对应w3wp.exe显示的进程ID号(转载)
管理员身份运行cmd,跳转到C:\Windows\System32\inetsrv目录,然后运行appcmd list wp即可查看
- 1342: [Baltic2007]Sound静音问题
1342: [Baltic2007]Sound静音问题 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 710 Solved: 307[Submit][ ...
- 剑指offer_(4)
重建二叉树: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍 ...
- conky 1.10以后的新配置格式
包装 config conky.config = { ... } 包装 TEXT conky.text = [[ ... ]] 每个 config 选项的变量和取值之间插入 "=" ...
- HTML5—canvas绘制图形(1)
1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的“ ...
- 基于Modbus的C#串口调试开发
说明:本文主要研究的是使用C# WinForm开发的串口调试软件(其中包含Modbus协议相关操作).Modbus相关协议可以查阅百度文库等,可参考: <http://wenku.baidu.c ...
- 关于ORACLE通过file_id与block_id定位数据库对象遇到的问题的一点思考
在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object).例如,我们在10046生成的trace文件中file#=4 block ...