二分图学习记 之 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 思路:最优匹配(最大权完美匹配) ...
随机推荐
- intellij idea从git检出代码并建立工程
1. 打开intellij idea,点击configure,settings 2. 左侧展开Version Control,点击Git,点击下图中红框中按钮 3. 在弹出窗口中找到git.exe,点 ...
- VSCode 开发插件 推荐
VSCode 必装的 10 个高效开发插件 本文介绍了目前前端开发最受欢迎的开发工具 VSCode 必装的 10 个开发插件,用于大大提高软件开发的效率. VSCode 的基本使用可以参考我的原创视 ...
- 图解隐马尔可夫模型(HMM)
写在前面 最近在写论文过程中,研究了一些关于概率统计的算法,也从网上收集了不少资料,在此整理一下与各位朋友分享. 隐马尔可夫模型,简称HMM(Hidden Markov Model), 是一种基于概率 ...
- C# delegate multicast single delegate
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serializatio ...
- sql server 查询出整数 (可灵活运用)
系统辅助用表,常用来获取数字,当然还有其他用途
- python基础(5):格式化输出、基本运算符、编码问题
1. 格式化输出 现在有以下需求,让⽤户输入name, age, job,hobby 然后输出如下所⽰: ------------ info of Alex Li ----------- Name : ...
- python库的tkinter带你进入GUI世界(计算器简单功能)
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 一个处女座的程序猿 PS:如有需要Python学习资料的小伙伴可以加 ...
- sharepointOnline的外接应用创建
#CODE STARTS HERE $programFiles = [environment]::getfolderpath("programfiles") add-type -P ...
- Vue常用语法
一.模板语法 1.双大括号表达式 [语法:] {{exp}} 用于向页面输入数据,即页面显示数据. [举例:] <!doctype html> <html lang="en ...
- Android JS打开原生应用
设置App通过网页JS,唤醒打开本地应用. 在AndroidManifest 中,在应用启动页配置下,添加android:exported="true",设置category 添加 ...