二分图最大权值匹配 KM算法 模板

KM算法入门 KM算法入门 在学习KM算法前,我们先感受一下匈牙利算法(由匈牙利数学家Edmonds提出)。 匈牙利算法 解决何种问题的呢 匈牙利算法是解决二分图的最大匹配度问题。 何为二分图 如果用染色法来判断的话,那么整幅图最后只会有两种颜色的元素;所谓二分图,就是可以划分为两个集合,且同一集合中的元素是互不相连的,不同集合中的元素是可以相连的。 下面我们通过一个简单的例子来说明: 现在... 阅读详情

KM算法详解+模板

 大佬讲的太好了!!!太好了!!!

 转载自:http://www.cnblogs.com/wenruo/p/5264235.html

KM算法用来求二分图最大权完美匹配。

本文配合该博文服用更佳:趣写算法系列之--匈牙利算法

 

本文没有给出KM算法的原理,只是模拟了一遍算法的过程。另,博主水平较差,发现问题欢迎指出,谢谢!!!!

 

现在有N男N女,有些男生和女生之间互相有好感,我们将其好感程度定义为好感度,我们希望把他们两两配对,并且最后希望好感度和最大。

KM算法详解-wenr

怎么选择最优的配对方法呢?

首先,每个女生会有一个期望值,就是与她有好感度的男生中最大的好感度。男生呢,期望值为0,就是……只要有一个妹子就可以啦,不挑~~

这样,我们把每个人的期望值标出来。

KM算法详解-wenr

接下来,开始配对。

配对方法:

我们从第一个女生开始,分别为每一个女生找对象。

每次都从第一个男生开始,选择一个男生,使男女两人的期望和要等于两人之间的好感度。

注意:每一轮匹配,每个男生只会被尝试匹配一次!

 

具体匹配过程:

==============为女1找对象===============

(此时无人配对成功)

根据 “男女两人的期望和要等于两人之间的好感度”的规则

女1-男1:4+0 != 3

女1-男3:4+0 == 4

所以女1选择了男3

女1找对象成功

==============为女1找对象成功============

 

==============为女2找对象===============

(此时女1—男3)

根据配对原则,女2选择男3

男3有主女1,女1尝试换人

我们尝试让女1去找别人

尝试失败

为女2找对象失败!

==============为女2找对象失败============

 

这一轮参与匹配的人有:女1,女2,男3。

怎么办???很容易想到的,这两个女生只能降低一下期望值了,降低多少呢?

这轮

比如:女1选择男1,期望值要降低1。 女2选择男1,期望值要降低1。 女2选择男2,期望值要降低2。

于是,只要期望值降低1,就有妹子可能选择其他人。所以妹子们的期望值要降低1点。

同时,刚才被抢的男生此时非常得意,因为有妹子来抢他,于是他的期望值提高了1点(就是同妹子们降低的期望值相同)。

于是期望值变成这样(当然,不参与刚才匹配过程的人期望值不变)

KM详解-wenr

==============继续为女2找对象=============

(此时女1—男3)

女2选择了男1

男1还没有被配对

女2找对象成功!

==============为女2找对象成功=============

 

==============为女3找对象===============

(此时女1—男3,女2-男1)

女3没有可以配对的男生……

女3找对象失败

==============为女3找对象失败============

此轮只有女3参与匹配

此时应该为女3降低期望值

降低期望值1的时候,女3-男3可以配对,所以女3降低期望值1

KM算法详解

 

==============继续为女3找对象============

(此时女1—男3, 女2-男1)

女3相中了男3

此时男3已经有主女1,于是女1尝试换人

女1选择男1

而男1也已经有主女2,女2尝试换人

前面说过,每一轮匹配每个男生只被匹配一次

所以女2换人失败

女3找对象再次失败

==============为女3找对象失败============

这一轮匹配相关人员:女1,女2,女3,男1,男3

此时,只要女2降低1点期望值,就能换到男2

(前面提过 只要任意一个女生能换到任意一个没有被选择过的男生所需要降低的最小值)

我们把相应人员期望值改变一下

KM算法详解-wenr

 

==============还是为女3找对象============

(此时女1—男3, 女2-男1)

女3选择了男3

男3有主女1,女1尝试换人

女1换到了男1

男1已经有主女2,女2尝试换人

女2换人男2

男2无主,匹配成功!!!

==============为女3找对象成功=============

匹配成功!!!撒花~~

到此匹配全部结束

此时

女1-男1,女2-男2,女3-男3

好感度和为最大:9

 

 

虽然不停换人的过程听起来很麻烦,但其实整个是个递归的过程,实现起来比较简单。比较复杂的部分就是期望值的改变,但是可以在递归匹配的过程中顺带求出来。

 

模板(带详细注释)(入门题:HDU2255(复杂度应该是O(N^3)

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 
  5 using namespace std;
  6 const int MAXN = 305;
  7 const int INF = 0x3f3f3f3f;
  8 
  9 int love[MAXN][MAXN];   // 记录每个妹子和每个男生的好感度
 10 int ex_girl[MAXN];      // 每个妹子的期望值
 11 int ex_boy[MAXN];       // 每个男生的期望值
 12 bool vis_girl[MAXN];    // 记录每一轮匹配匹配过的女生
 13 bool vis_boy[MAXN];     // 记录每一轮匹配匹配过的男生
 14 int match[MAXN];        // 记录每个男生匹配到的妹子 如果没有则为-1
 15 int slack[MAXN];        // 记录每个汉子如果能被妹子倾心最少还需要多少期望值
 16 
 17 int N;
 18 
 19 
 20 bool dfs(int girl)
 21 {
 22     vis_girl[girl] = true;
 23 
 24     for (int boy = 0; boy < N; ++boy) {
 25 
 26         if (vis_boy[boy]) continue; // 每一轮匹配 每个男生只尝试一次
 27 
 28         int gap = ex_girl[girl] + ex_boy[boy] - love[girl][boy];
 29 
 30         if (gap == 0) {  // 如果符合要求
 31             vis_boy[boy] = true;
 32             if (match[boy] == -1 || dfs( match[boy] )) {    // 找到一个没有匹配的男生 或者该男生的妹子可以找到其他人
 33                 match[boy] = girl;
 34                 return true;
 35             }
 36         } else {
 37             slack[boy] = min(slack[boy], gap);  // slack 可以理解为该男生要得到女生的倾心 还需多少期望值 取最小值 备胎的样子【捂脸
 38         }
 39     }
 40 
 41     return false;
 42 }
 43 
 44 int KM()
 45 {
 46     memset(match, -1, sizeof match);    // 初始每个男生都没有匹配的女生
 47     memset(ex_boy, 0, sizeof ex_boy);   // 初始每个男生的期望值为0
 48 
 49     // 每个女生的初始期望值是与她相连的男生最大的好感度
 50     for (int i = 0; i < N; ++i) {
 51         ex_girl[i] = love[i][0];
 52         for (int j = 1; j < N; ++j) {
 53             ex_girl[i] = max(ex_girl[i], love[i][j]);
 54         }
 55     }
 56 
 57     // 尝试为每一个女生解决归宿问题
 58     for (int i = 0; i < N; ++i) {
 59 
 60         fill(slack, slack + N, INF);    // 因为要取最小值 初始化为无穷大
 61 
 62         while (1) {
 63             // 为每个女生解决归宿问题的方法是 :如果找不到就降低期望值,直到找到为止
 64 
 65             // 记录每轮匹配中男生女生是否被尝试匹配过
 66             memset(vis_girl, false, sizeof vis_girl);
 67             memset(vis_boy, false, sizeof vis_boy);
 68 
 69             if (dfs(i)) break;  // 找到归宿 退出
 70 
 71             // 如果不能找到 就降低期望值
 72             // 最小可降低的期望值
 73             int d = INF;
 74             for (int j = 0; j < N; ++j)
 75                 if (!vis_boy[j]) d = min(d, slack[j]);
 76 
 77             for (int j = 0; j < N; ++j) {
 78                 // 所有访问过的女生降低期望值
 79                 if (vis_girl[j]) ex_girl[j] -= d;
 80 
 81                 // 所有访问过的男生增加期望值
 82                 if (vis_boy[j]) ex_boy[j] += d;
 83                 // 没有访问过的boy 因为girl们的期望值降低,距离得到女生倾心又进了一步!
 84                 else slack[j] -= d;
 85             }
 86         }
 87     }
 88 
 89     // 匹配完成 求出所有配对的好感度的和
 90     int res = 0;
 91     for (int i = 0; i < N; ++i)
 92         res += love[ match[i] ][i];
 93 
 94     return res;
 95 }
 96 
 97 int main()
 98 {
 99     while (~scanf("%d", &N)) {
100 
101         for (int i = 0; i < N; ++i)
102             for (int j = 0; j < N; ++j)
103                 scanf("%d", &love[i][j]);
104 
105         printf("%d\n", KM());
106     }
107     return 0;
108 }

 

 

 

km算法入门 本文知识均由笔者自学,文章有错误之处请不吝指出。 笔者刷数模题的时候有一道题考到了“二分图最大权分配”,需要用到KM算法,但是书上对KM算法的介绍又臭又长,更何况有些同学“匈牙利算法”也没学过(由匈牙利数学家Edmonds提出),自然难以理解所谓的KM算法。本文旨在用通俗易懂的语言,向读者介绍匈牙利算法和KM算法。 一、匈牙利算法 匈牙利算法用于解决什么问题? 匈牙利算法用于解... 阅读详情

相关推荐

二分图的最佳完美匹配——KM算法

二分图的最佳完美匹配如果二分图的每条边都有一个权(可以是负数),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最佳完美匹配。(特殊的,当所有边的权为1时,就是最大完备匹配问题) 我们使用KM算法解决该问题。KM(Kuhn and Munkres)算法,是对匈牙利算法的一种贪心扩展,如果对匈牙利算法还不够明白,建议先重新回顾一下匈牙利算法。KM是对匈牙利算法的一种贪心扩展,这种贪心不是对边的权

六天 5万+

网络流 增广路 入门很好的文章

Edmonds_Karp 算法 (转) 找了好久终于在这个牛这里找到为什么反向边要加回流量的原因了, 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明。也尽量给出了较为完整的代码。 本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们。本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond...

weixin_30706691的博客 1140

KM算法(完备匹配下的最大权匹配)

KM算法求的是完备匹配下的最大权匹配: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接XiYj有权wij,求一种匹配使得所有wij的和最大。 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:分房子,对于n个人对n所房子有自己的最大承受价格,要求每个人分到一所房子,并且要求收入最大 输入说明:输入n,代表n个人和n所房子

M_GSir的博客 2536

【转载】KM算法原理+证明

KM算法原理+证明 原创 ...

Huah_2018的博客 1532

二分图最大权匹配 (KM算法)

二分图最大权完美匹配KM算法是在一个二分图里,求一个最大权匹配,但是要求这个匹配必须是完美匹配。如果匹配不一定是完美匹配,那么似乎只能将其转化为最小费用最大流来做了。我们可以使用KM算法对任意带权(无论正负权)二分图求最大/最小权完美匹配,它的算法复杂度是O(n3),但是如果写得不好会变成O(n4)。 KM算法是通过给每个顶点一个标号(我们有时称之为顶标)来把求最大权匹配的问题转化为求完备匹

LSS 1463

二分图最大权匹配 、 最小权匹配 模板

#include #include using namespace std; const int maxn=160,INF=2147483647; int w[maxn][maxn]; int lx[maxn],ly[maxn]; int linky[maxn]; int visx[maxn],visy[maxn]; int N; int slack[maxn]; void input() { scanf("%d",&N); for(int i=0;i

Rachel Zhang的专栏 5135

KM算法详解+模板(二分图最大权值匹配)

转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配。 本文配合该博文服用更佳:趣写算法系列之--匈牙利算法   本文没有给出KM算法的原理,只是模拟了一遍算法的过程。另,博主水平较差,发现问题欢迎指出,谢谢!!!!   现在有N男N女,有些男生和女生之间互相有好感,我们将其好感

shyoldman的博客 1万+

模板 - KM算法(O(n^3))(二分图最大权完美匹配)

题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配。 求一种完美匹配的方案,使得最终匹配边的边权之和最大。 //Data const int N=500; int n,m,e[N+7][N+7]; //KM int mb[N+7],vb[N+7],ka[N+7],kb[N+7],p[N+7],c[N+7]; int qf,qb,q[N+7]; void Bfs(int u){ int a,v=0,vl=0,d; for(int i=1;i<=n;i

繁凡さん的博客 1239

KM算法 求二分图最大权值的完美匹配 【模板 记录】

概念介绍 可行顶标:一个节点函数l,使得对任意弧都有lx[x] + ly[y] >= Map[x][y]。 相等子图:是原关系的生成子图G,包含所有点,但只包含满足lx[x] + ly[y] = Map[x][y]的弧。 匈牙利树:当前拥有匹配关系

世界很大 1279

Moltemplate建模----水盒子data文件

1功能介绍 Moltemplate是LAMMPS官方支持的建模工具之一,适用于LAMMPS建模。该程序创建了一种简单的文件格式来存储分子定义和力场,即模板LT。LT文件包含与特定分子有关的所有文本(包括坐标,键拓扑,角度,力场参数,约束,组和修复)。 Moltemplate可以复制分子,对其进行自定义,然后用它作为构建更大、更复杂分子的基础。构建后,可以自定义...

元素魔方科研服务 2598

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 359

HDU - 2255 奔小康赚大钱 (二分图最大权值匹配模板)(KM算法)

传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。 这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。 另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济...

birdmanqin的博客 213

在ZYNQMP上点亮800x480 LCD屏:从framebuffer到DRM框架的完整驱动移植实战

本文详细介绍了在ZYNQMP平台上点亮800x480 LCD屏的完整驱动移植实战,从framebuffer到DRM框架的技术实现。内容涵盖硬件配置、设备树设置、显示时序参数调试以及DRM驱动核心实现,帮助开发者快速掌握PetaLinux系统中的LCD驱动开发技巧。

weixin_33701294的博客 427

HDU 2255(KM模板)

带权二分图最大权值匹配问题 关于KM算法的讲述可以看下面这篇博客(转) : https://blog.youkuaiyun.com/chenshibo17/article/details/79933191 下面是自用KM模板 : 其中的 n 是二分图中左侧个数, m 是二分图中右侧个数, 因为此题左侧和右侧个数相同, 此时 n 和 m 相同。 ps:还是不知道为什么从 1 ~ n(而不是从 0 ~ n-1)做...

qq_43555854的博客 179

银河麒麟V10新特性解析:从安装到AI应用的全面指南

本文全面解析银河麒麟V10操作系统的新特性,从安装指南到AI应用开发,详细介绍了其智能调度引擎、神经网络加速和场景化AI工具集等核心功能。通过实战案例展示如何高效配置AI环境、优化性能,并解决常见问题,助力开发者在国产操作系统上实现高效AI开发与应用部署。

seed的博客 302

VConsole动态加载

// 移动端真机调试工具 vconsole import VConsole from "vconsole"; import Vue from "vue"; // 动态使用VConsole if(process.env.NODE_ENV==='production'){ if(process.env.VUE_APP_BASEURL.includes('test')||process.env.VUE_APP_BASEURL.includes('pre')){ Vue.prototype

aliven1的博客 1043

hdu 2255 奔小康赚大钱(KM完美匹配)

http://acm.split.hdu.edu.cn/showproblem.php?pid=2255KM的裸题。简单描述一下KM算法的思想:1)首先选择顶点数较少的为X部,初始的时候对X部的每一个顶点设置顶标,顶标的值为该点关联的最大边的权值,Y部的顶点坐标为0.2)对于X部中的每个顶点,在相等子图中利用匈牙利算法找一条增广路径,如果没有找到,则修改顶标,扩大相等子图,继续找增广路径。当每个点都

HJ 476

DAP-Link DIY复刻指南

DAP-Link是ARM开源的一个项目,主要用于代码下载以及调试,支持SWD和JTAG调试接口,对于开发嵌入式的同学相信都或多或少有所耳闻。除了DAP-Link之外还有很多同类型的调试器,如ST-LinkJ-Link,但是这些都是不开源的,无法复刻或进行二次开发。但DAP-Link不同,完全开源,不用担心侵权问题,且随着开源社区大家的共同努力,DAP-Link经过了不断的迭代,先如今已取代ARM之前推出的CMSIS-DAP开源项目。

爱出名的狗腿子 1万+

KM算法

两个不错的介绍KM算法的文章: 1:http://www.cppblog.com/MatoNo1/archive/2011/07/23/151724.aspx 2: KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条...

weixin_30384217的博客 91

【Frida Android】实战篇4:SSL Pinning 证书绑定绕过 Hook 教程(一)

在前两章中,我们学习了中间人抓包与 Hook 抓包的基础方法,这些方法在理想环境下能够有效获取网络请求数据。但在实际的企业级应用中,出于安全防护需求,很多 APP 会启用证书绑定(SSL Pinning)机制。这种机制会让客户端对服务器证书的校验更为严格,导致常规的抓包方法(即使将 BurpSuite/Charles 证书安装到系统信任区)也无法生效。因此,从本章开始,我们将系统学习 SSL Pinning 机制的绕过技术。SSL Pinning(证书绑定)是客户端校验服务器身份的进阶安全机制。

水滴石穿 1612

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 213

KM算法二分图完美匹配 模板

#include #include #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; int lx[M],ly[M]; //lx,ly为顶标,nx,ny分别为x点集y点集的个数 int _visx[M],_visy[M],w[M][M],_slack[M],_link[M]; int DFS(int x) { _visx[x]

bitwater的空间 586

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

2018年2月27日训练日记

今天主要是看二分图的最优匹配内容。有的边无权值:对于那些原本不存在的边就赋值为负无穷.那么当我们求出最优匹配的时候,如果存在某条匹配边的权值是负无穷,那么代表本问题无解. 否则的话总权值就是最优匹配的权值解.涉及到优先用原匹配边的问题:例(by 饶齐):HDU 2853 Assignment题意:给定一个二分图,N个点对应M个点,两两之间存在一组关系,每组关系一个权值。题目中了给定了一个匹配方案,...

LSD20164388的博客 470

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二分图匹配——最大匹配(匈牙利算法),完美匹配(最大权值匹配,KM算法)

@匈牙利算法,KM算法模板 1.匈牙利算法 匈牙利算法的基本原理如下: ①置M为空; ②找到一条增广路径P,通过异或操作获得更大的匹配M’代替M; ③重复②直到找不到新的增广路径。 增广路径的定义如下: 若P是图G中一条联通两个未匹配顶点的路径,且属于M的边和不属于M的边在P上交替出现,则称P为相对于M的一条增广路径。 ①初始状态 当前已有边(1,1’)和(4,3’)属于M。 ②找到一条增广路径...

weixin_44519109的博客 3754

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二分图最大权完美匹配(KM算法)

太难了,蒟蒻只能背模板 二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连接的边带有权值时,要寻找匹配后权值和最大的方案,且保证A集合中的点均有B中的点能匹配。此时问题就转化为二分图最大权完美匹配。 KM算法核心为:为每一点添加顶标,在顶标的限制下用匈牙利算法处理出最大匹配数,若最大匹配数=n,则达到最优解,输出。否则修改顶标,再用匈牙利算法处理,如此重复。 参考:二分图最大权完美匹配 题解 (转载模板) 【模板】二分图最大权完美匹配 //Data const int N=500; int n,m,e[N+

Khasehemwy的博客 1584
上一篇: POJ 3020 Antenna Placement 【最小边覆盖】
下一篇: POJ 2195 Going Home 【二分图最小权值匹配】
莜莫oO
博客等级 码龄9年 7粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值