【算法•日更•第五十期】二分图(km算法)
▎前言
没想到我的博客竟然被别人据为己有了,还没办法投诉。
这年头写个博客太难了~~~
之前小编写过了二分图的一些基础知识和匈牙利算法,今天来讲一讲km算法,若你不知道匈牙利算法,请先看下面的博客。(否则会体验极差)
▎km算法
☞『引入』
之前学习的匈牙利算法还记得吗?它处理的是无权二分图,长这个样子:

//mspaint画出来的真粗糙
但是如果加入了权值呢?比如说是这个样子的:

现在,我们的问题变了,不再求最大匹配问题了,而是最优匹配问题,就是说在原来的基础上,要求匹配值的和最大。
考虑使用匈牙利算法求解,显然,我们可以求出每一个最大匹配,然后比较权值和,但是当数据规模大起来后,这无疑是很暴力的,所以我们只能另起炉灶,使用km算法。
也就是说km算法是来处理有权二分图的。
☞『定义』
KM算法是一种计算机算法,功能是求完备匹配下的最大权匹配。在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接XiYj有权wij,求一种匹配使得所有wij的和最大。(copy自百度百科)
☞『算法流程』
先来讲讲算法的原理吧,我们有这样一个图用来匹配:

对于左边每个点我们设置一个量用来存对右边的所有边的权值的最大值。
对于右边的每个点我们设置一个量来存对左边点的需要程度。
从始至终,我们一直要对一个取的边保持一个式子:左边的取值最大值+右边的需求值=边的权值。
因此,右边初始需求值都为0。
那么,这个图,就长这个德性了:

☞『算法模拟』
首先从第一条边开始寻找,不断试探,因为3+0=3直接使用最大的那条边(A -> b):

接着第二条5+0=5(B -> b):

发生冲突!!!此时,要么A放弃,要么B放弃,两者皆可,不过B只有一条路走,所以我们放弃A,改选A -> a这条路:

这个时候A所使用的不能是3了,而是2,所以修改A左边的数字为2,B也要减一,本图因为B只有一条路,所以B不能放弃,但是要记得正常情况下,两条边都可以放弃的,为了保证正常,我们应该修改b右边的值为1,使式子成立。
修改后就是这个样子的:

接着试探4,发现4+1!=4,(与B发生冲突)所以行不通:

降低最大值走另一条路:

至此,算法演示结束。
【算法•日更•第五十期】二分图(km算法)的更多相关文章
- 【算法•日更•第五十四期】知识扫盲:什么是operator?
▎前言 这个东西和迭代器长的很像,但是比迭代器常见的多. 今天就来浅谈operator. ▎定义 operator是C#.C++和pascal的关键字,它和运算符一起使用,表示一个运算符函数,理解时应 ...
- 【算法•日更•第五十七期】快速傅里叶变换(FFT):从入门到放弃
▎一些用的上的东西 小编太菜了,很多东西都不会证明(主要是三角函数还没有学啊~~~). 附上链接https://blog.csdn.net/enjoy_pascal/article/details/8 ...
- 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题: P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...
- 【算法•日更•第三十一期】KMP算法
▎前言 这次要讲的HMP算法KMP算法很简单,是用于处理字符串的,之前一直以为很难,其实也不过如此(说白了就是优化一下暴力). ▎处理的问题 通常处理的问题是这样的:给定两个字符串s1和s2,其中s1 ...
- 【算法•日更•第三十五期】FF算法优化:EK算法
▎写在前面 FF算法传送门 之前我们已经学过了FF算法(全称Ford-Fulkerson算法)来找最大流,但是这种算法仍有诸多不对的地方. 其实这种算法存在着严重的效率的问题,请看下面的图: 以这个图 ...
- 【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解
废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己, ...
- 【算法•日更•第三十七期】A*寻路算法
▎写在前面 这是一种搜索算法,小编以前总是念成A乘寻路算法,没想到一直念错. 请大家都念成A星寻路算法,不要像小编一样丢人了. ▎A*寻路算法 ☞『引入』 相信大家都或多或少的玩过一些游戏吧,那么游戏 ...
- 【算法•日更•第四十七期】Mac与windows系统的差别
小编最近装了个Mac系统,因为小编已经有笔记本可以用linux了,所以就决定在台式机上装个双系统,结果一不小心把Mac装在C盘上了,哎,说多了都是泪啊. 其实用了Mac之后才发现windows特别好用 ...
- 【算法•日更•第四十二期】离散傅里叶变换(DFT)
▎前言 小编相当的菜,这篇博客难度稍高,所以有些可能不会带有证明,博客中更多的是定义. 我们将要学到的东西: 复数 暴力多项式乘法 DFT 当然,小编之前就已经写过一篇博客了,主要讲的就是基础多项式, ...
随机推荐
- 设计模式:prototype模式
使用场景:在不能根据类创建对象的时候,根据已有的对象创建对象 不能根据类创建对象的情况: 创建一个类的对象时,需要根据多种对象来创建,创建的过程非常复杂 难以根据类生成对象 例子: class Pro ...
- FaaS 给前端带来了什么?
一.Serverless 与 FaaS Serverless 是一种云计算理念,即无服务器计算(Serverless Computing): Serverless suggests that the ...
- java enum 枚举类
图一代码: public enum LogMethodEnum { WEBCSCARDVALID("返回值"), WEBCSVERIFYPASSWORD("返回值&quo ...
- asp.net core appsetting.json 绑定读取
appsettings.json中,具有: "AppSettings": { "AzureConnectionKey": "***", &q ...
- EOJ Monthly 2019.11 A(进制转换)
"欢迎您乘坐东方航空公司航班 MU5692 由银川前往上海......" "我们的飞机很快就要起飞了,请收起小桌板,摘下耳机......" 收起了小桌板,摘下了 ...
- linux虚拟机正常安装完成后获取不到IP的解决办法-网卡
通常正常情况下安装完linux虚拟机,只需要使用桥接并修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,将如下参数值改为如下: ONBOOT=yes NM ...
- 使用@ControllerAdvice处理异常
在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...
- Tkinter经典写法
1.继承 tkinter.Frame 类,实现类的基本写法 2.创建主窗口及主窗口大小位置及标题 3.将需要添加的组件放入到类中进行创建, 继承的 Frame 类需要使用 master 参数作为父类的 ...
- 珍藏多年的学习资料300G+,赶紧免费领取,从此离大神更进一步
将时间线拉到2014 2014年的寒冬,每天早晨六点钟,都会一个弱小的身影,从学校寝室出发,走在去实习公司的路上.经过食堂边的包子铺,他会顺手买两个包子,一杯豆浆,老板也会像往常一样热情的吆喝 ...
- 2019 HL SC day2
今天讲的是网络流 大部分题目都写过了 这里 就总结一番. bzoj 1066 裸的最大流 不过需要拆点细节方面有一点坑 剩下的 没什么了. //#include<bits/stdc++.h> ...