KM算法解决二分图最大权分配问题
匈牙利算法和KM算法都可用来解决任务分配问题(亦称指派问题):假设有n名员工以及n份工作,一个人只能完成一项任务且能完成的任务各不相同。问如何安排员工才能使效率达到最大。
用大白话来描述二分图:二分图可划分为两个集合{员工},{工作},两个集合之间的元素可以相连,同一个集合内的元素不能相连。
如图的二分图匹配问题可以用匈牙利算法解决。
现在我们思考另外一个问题:上图中我们默认A、B、C的工作效率是一样的(即A员工或者B员工完成工作a的时间是相等的),这种情况在现实生活中只是少数。那么A、B、C员工完成不同的工作有不同效率的话,应该如何得到最优匹配呢?
KM算法就是用来解决二分图最大权分配问题,其步骤如下所示:
①左边的顶点赋值为最大权重,右边顶点赋值为0。
②匹配。匹配的原则是只匹配与最大效率相等的边。如果匹配失败,那么参与匹配的所有左顶点的值-1,右顶点+1,直至匹配完成。
按照此约定,我们对A进行匹配:连接Ac,匹配成功!
接下来我们对B员工进行匹配。但是我们发现,与B最大效率匹配的边只有Bc,而c已经和A进行匹配了,怎么办呢?正常的思路是看看A还有没有其他符合的边,只可惜没有。按照匹配的原则,需要对A、B的效率-1,对c+1。这样一来,A的效率更新为3,B的效率更新为2,c的值变为1。
通过-1、+1操作,Ac、Bc仍然是可以匹配的边:3+1=4,2+1=3。除此之外还给我们带来了新的选择:Aa和Ba。
这样一来,B就可以在不改变A工作的前提下找到工作了。匹配Ba成功!
现在我们来匹配C。由于5+1≠5,且c已经和A匹配了。于是我们找到A,看看A还有没有别的选择。我们发现A出了可以和c匹配(3+1=4),还可以和a进行匹配(3+0=3)。正想匹配Aa的时候又发现a已经和B进行匹配了。于是我们找到B,看看B还有没有其他符合的匹配。但是此时B表示自己能力有限,可谓是爱莫能助啊,自己只能和a进行匹配了。那么参与到此次"争端"的结点有:A、B、C、a、c,交给匹配原则进行”处置“。
(这步有点套娃,原理搞懂就不觉得难了。)
更新各值如图所示:
对于现在来说,B就可以匹配了!(1+0=1)
由匈牙利算法的取反操作(下方有解释),即可得到最终匹配。
这就是KM算法的整个过程,每次给一个顶点找到最大权重边,配合匈牙利算法找到最大匹配,从而得到完美匹配。
匈牙利算法处理”冲突问题“:
在Aa已经匹配成功的前提下,若B只能匹配a,那么匈牙利算法告诉我们可以通过一条增广路径,通过取反操作,我们就能匹配更多的点。
增广路径的定义:从一个未匹配的顶点开始,经过若干个匹配顶点,最后到达对面集合的一个未匹配顶点的路径,也就是说,这条路径将两个不同集合的两个未匹配顶点通过一系列匹配顶点相连。
在此题中,A还可以和c匹配,就产生了增广路:B--a--A--c,经过取反操作之后,匹配更新为:
由这一轮操作,增加了一条匹配边,解决了矛盾。这就是匈牙利算法增广路径取反的巧妙之处!
我们可以在出现冲突的时候寻找增广路径,从而找到最优匹配。
参考文章:km算法入门 - logosG - 博客园
KM算法解决二分图最大权分配问题相关推荐
- 利用匈牙利算法Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES...
首先介绍一下题意:已知,有N个学生和P门课程,每个学生可以选0门,1门或者多门课程,要求在N个学生中选出P个学生使得这P个学生与P门课程一一对应. 这个问题既可以利用最大流算法解决也可以用匈牙利算法解 ...
- 匈牙利算法解决二分图匹配问题
匈牙利算法是由匈牙利数学家Edmonds于1965年提出.匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的 ...
- 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))
整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...
- 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱
作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...
- 奔小康赚大钱 HDU - 2255( 二分图匹配KM算法详解)
题目 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百 ...
- 二分图最佳完美匹配——KM算法总结
KM 算法 求解二分图最佳完美匹配的算法. 先来看一道例题Hdu 2255. 显然是KM的裸题.假设我们要匹配集合X和Y的点,先给每个点一个顶标Lx和Ly. 为什么要给顶标? 首先顶标是我们限制边的一 ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- km算法c语言,KM算法最好的讲解+POJ2195[KM算法+最小费用流]
二.KM算法: 二分图最优匹配:对于二分图的每条边都有一个权(非负),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最优完备匹配.(特殊的,当所有边的权为1时,就是最大完备匹配问题) 解二分图最 ...
- KM算法 入门——[kuangbin]KM匹配
之前写过了关于普通二分匹配的相关题目了,就是寻找尽量多的边使得任意边连接的两点都没有与其他边相连,而km算法解决的则是在带权的二分图中寻找权值和最大的匹配,可以通过先给无连接的点连上权值为0或者负无穷 ...
最新文章
- nanodet学习笔记 tensorrt
- 关于两个php.ini的说明
- python提取html正文为txt,python 提取html文本的方法
- mysql if语句
- 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍
- centos 7 下使用dvorak键盘布局
- C#中英文逗号之间的相互转化
- java mysql存储图片_Java存储图片到Mysql
- 谭浩强 C程序设计 8.2 求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。...
- linux 修改ip地址 和关闭防火墙设置
- 锻炼编程思维的小题目
- JDK API 1.6.0中文版纯分享
- 卡尔曼滤波器:用R语言中的KFAS建模时间序列
- console,控制台也能玩出花样(console操作大全)
- CENTOS上的网络安全工具(五)CODE来打个酱油
- MyBatis关联对象查询
- oppo手机删除计算机怎样恢复,▷提示|如何将OPPO手机恢复为出厂设置
- Parasoft案例研究:医疗器械软件验证与合规性
- 五楼小黑屋深造之思想升华
- IntelliJ IDEA 2018.3 安装、永久破解及新特性说明