二分图学习记 之 KM算法 二分图最大权完美匹配。
前置知识 :匈牙利算法
首先有这样一张图,求这张图的最大权完美匹配。
当然如果你不想看这些渣图的话,您可以转到 洛谷 运动员最佳匹配问题
下面我来强行解释一下KM算法

左边一群妹子找汉子,但是每个妹子都对汉字的好感度不一样,我们首先看一看每个妹子的最大好感度[期望值]是多少,同时先暂时把汉字的最大好感度[期望值]设为0

现在妹子的梦想能不能实现呢,我们来看一看
NO.1给A找汉子
这张图有一个明显的特性,就是每个妹子与让她有好感的汉子之间的边权总小于等于妹子的最大期待值。
凭着我初中数学考炸的经验,告诉你当取等的时候,你就没有辜负这个妹子的期望值

成了,不管有接下来有什么矛盾,我们去给B找汉子吧
NO.2给B找汉子

现在看起来没有什么矛盾,然后妹子C进来了
NO.3给C找妹子
貌似没有那么容易了,因为B已经和c在一起了

现在怎么办呢? 协商一下吧,C对B说:“(磨刀声)要不您换个口味吧 你我各退一步吧”
B:ook
但是汉子c看见BC这样吵架 心里顿时骄傲,于是自己的骄傲值加个1

那现在不就好办了吗。

所以这张图的最大权完美匹配就是11了
伪代码就好办了
void 匈牙利()
{
判断访问妹子
遍历她的汉子们
返回
} void km()
{
for(每个点) //根据定义,每个点都能求到最大权 完美 匹配 的
{
for(尝试n次||while ) //这两个一个意思
{
if(求到妹子汉子之间期望值之和等于边权→匈牙利算法 ) break;
刷新妹子的期望值;
刷新汉子的骄傲值;
//不要忘了 每次匈牙利算法清空 vis
}
}
}
所以上一段代码,题就是开头的 运动员最佳匹配问题
#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm> using namespace std; int n,m,love[][],lx[],ly[];
int vx[],vy[],bd[],tot,mmn; int dfs(int t)
{
if(vx[t])return ;
vx[t]=;
int i;
for(i=;i<=n;i++)
{
if(vy[i]) continue;
int p=lx[t]+ly[i]-love[t][i];
if(!p)
{
vy[i]=;
if(dfs(bd[i])||!bd[i])
{
bd[i]=t;
return ;
}
}
else if(p>)
mmn=min(mmn,p);
}
return ;
} void km()
{
int i,j;
for(i=;i<=n;i++)
{
while()
{
mmn=0x3f3f3f3f;
memset(vx,,sizeof(vx));
memset(vy,,sizeof(vy));
if(dfs(i)) break;
for(j=;j<=n;j++)
{
if(vx[j]) lx[j]-=mmn;
if(vy[j]) ly[j]+=mmn;
}
}
}
} int main()
{
scanf("%d",&n);
int i,j;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&love[i][j]);
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
int t;
scanf("%d",&t);
love[j][i]*=t;
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
lx[i]=max(love[i][j],lx[i]);
}
km();
for(i=;i<=n;i++)
tot+=love[bd[i]][i];
printf("%d",tot);
return ;
}
二分图学习记 之 KM算法 二分图最大权完美匹配。的更多相关文章
- hdu1533 Going Home km算法解决最小权完美匹配
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
- HDU 3488 Tour (最大权完美匹配)【KM算法】
<题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...
- 【模板】二分图最大权完美匹配KM算法
hdu2255模板题 KM是什么意思,详见百度百科. 总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3). 给张图. 二分图有了边权,求最大匹配下的最大权值. 所以该怎么做呢?对啊 ...
- 【二分图最大权完美匹配】【KM算法】【转】
[文章详解出处]https://www.cnblogs.com/wenruo/p/5264235.html KM算法是用来求二分图最大权完美匹配的.[也就算之前的匈牙利算法求二分最大匹配的变种??] ...
- 二分图最大权完美匹配KM算法
KM算法二分图 KM求得二分图与普通二分图的不同之处在于:此二分图的每条边(男生女生)上都附了权值(好感度).然后,求怎样完美匹配使得权值之和最大. 这,不止一般的麻烦啊. 可以通过一个期望值来求. ...
- 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577
题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...
- Solution -「洛谷 P6577」「模板」二分图最大权完美匹配
\(\mathcal{Description}\) Link. 给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w( ...
- hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)
/** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...
随机推荐
- The trap of Bash trap
Can you spot the problem with the following Bash script? resource_created="false" function ...
- iOS:捋一遍View的生命周期
一.介绍 前面介绍了VC的生命周期,闲着没事也来捋一捋View的生命周期,简单用两个类型的View来监测.一个View纯代码创建,另一个View使用Xib创建. 二 .代码 MyCodeView: ...
- 【swoole】结合swoole 和 nsq 的实际应用
集合 swoole 的框架设计 为了减少理解度,我尽量的从源头开始引入 1. nsq 案例中是使用 swoole 结合一个php 框架实现的是 NSQ 订阅功能. 启动命令: sudo bash /w ...
- python保存文字到文件中
使用encode方法即可,举例如下: #-*-coding:utf-8-*- def save(re, name): file = open("index_cut.txt", &q ...
- Java13 闪亮来袭,你是否还停留在 Java8
近期 Java 界好消息频传.先是 Java 13 发布,接着 Eclipse 也发布了新版本表示支持新版本的 Java 特性. 本文介绍了 Java 13 的新特性并展示了相关的示例. 2019 年 ...
- 错误InnoDB:Attemptedtoopenapreviouslyopenedtablespace.
2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t ...
- 英语阅读——A meaningful life
这篇文章是<新视野大学英语>第四册的第八单元的文章. 1 The death of an angel of animal rights activism(活动家) does not rat ...
- Jsp学习笔记(2)——页面导航、表单、EL表达式
页面导航 有两种跳转页面的方法.重定向和请求转发 两者区别: 请求转发(forward) 重定向(rerect) 请求服务次数 1 2 是否保留第一次请求request范围的属性 保留 不保留 地址栏 ...
- Python超详细的字符串用法大全
字符串拼接 实际场景:把列表中的数据拼接成一个字符串 解决方案:使用 str.join() 方法 >>> li = ['cxk', 'cxk', 'kk', 'caibi'] > ...
- PHP-Curl模拟HTTPS请求
使用PHP-Curl方式模拟HTTPS请求,测试接口传参和返回值状态 上代码!! <?php /** * 模拟post进行url请求 * @param string $url * @par ...