【算法?日更?第五十期】二分图(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发生冲突)所以行不通:

  

  降低最大值走另一条路:

  

  至此,算法演示结束。

原文地址:https://www.cnblogs.com/TFLS-gzr/p/11392238.html

时间: 2024-08-30 00:29:41

【算法?日更?第五十期】二分图(km算法)的相关文章

【算法?日更?第五十六期】扩展欧几里得算法

▎裴蜀定理 这个定理很简洁,就是关于x,y(都是整数)的不定方程在下面的情况下: 必定有解. 这只是个前置知识,就不证明了(主要是小编太菜). ▎不定方程 考虑方程ax+by=c的解的情况: 若c=gcd(a,b),那么依照裴蜀定理有解: 若c=k*gcd(a,b),先两边同除k,就会转化成标准形式,有解: 若c与gcd(a,b)互质,那么无解: 所以问题就是: 如何解决,只要解决了这个问题,所有解的情况就解决了. ▎问题解决 现在我们考虑怎么让这个问题更简单,思考这样一个问题,已知: 的解(x

【算法?日更?第三十三期】网络流基础知识(最大流)

▎写在前面 小编早就听说过了网络流这种神奇的东西,一直以为很高端大气上档次,但是很难,就没学. 今日一见也不过如此,一点也不高端,不大气,不上档次. ▎网络流 ?『定义』 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与合成等新课题.网络流的应用已遍及通讯.运输.电力.工程规划.任务分派.设备更新以及计算机辅助设计等众多领域.(copy自百度) ?『介绍』 其实上面的度娘写

经典算法题每日演练——第十六题 Kruskal算法

原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从”顶点”这个角度来思考的,然后采用“贪心思想” 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在”边“这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs): 比如M集合中的每个元素都可以认

【算法?日更?第二十五期】万能算法(一):搜索+?

▎前言 看到这个标题,你是不是倍感疑惑,为什么会是搜索+,而不是搜索,会不会是小编打错的,其实本篇博客将会让你看到搜索的各种玩法. ▎前置技能 ?『基础知识』 搜索:dfs和bfs(戳这里迅速上手). ?『dfs和bfs的异同点』 相同点:dfs和bfs都用于搜索,都是来寻找点的. 不同点:dfs以深度为优先,不撞南墙不回头,一鼓作气搜遍一条路,所以比较不靠谱,但是代码量少,也好写,大部分人都喜欢用.而bfs则是以广度为优先,逐层遍历,相比dfs来说更加理性,但是当状态不好存储时,就只能用dfs

【算法?日更?第二十期】构造分治

▎什么是分治? ?『定义』 分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.在计算机科学中,分治法就是运用分治思想的一种很重要的算法.分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等.(copy自百度) 一句话总结:分治就是把大问题转化成若干小问题,小问题解决后,大问题自然就迎刃而解. ?『使用条件』 ①大问题分解成

【算法?日更?第二十六期】非常基础的数论

一说到基础数论,那么我们就从整除那套理论开始谈起. ▎整除 ?『定义』 如果a能把b整除,也就是没有余数,则我们称a整除b,亦称b被a整除,记为a|b. 其中的“|”称为整除符号. ?『性质』 ①自反性:显然,对于任意正整数n,有n|n: ②传递性:若有a|b,b|c,则有a|c: ③反对称性:若a|b,b|a,则有a=b: 其中性质③很有用,通常用于无法直接证明a=b的情况,不过用到的少. ▎约数和倍数 ?『定义』 如果a|b,那么a是b的约数,b是a的倍数,也称a是b的因数/因子. ?『推论

【算法?日更?第八期】区间动态规划:1572:括号配对题解

废话不多说,直接上题: 题目测评链接:戳这里 其实什么GBE都没用,小编最开始看了半天不懂,看了看别人的博客才知道这段话没什么用处.其实就是给一段字符串,判断是否括号是配对的. 这道题一看就会想到区间动态规划(不会戳这里临时补一补),最开始先老老实实地写了一遍区间动态规划,后来觉得用栈也可以,于是写了一遍,代码如下: 1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace

【算法?日更?第十七期】信息奥赛一本通1598:【 例 2】最大连续和题解

废话不多说,直接上题: 1598:[ 例 2]最大连续和 时间限制: 1000 ms         内存限制: 524288 KB提交数: 303     通过数: 91 [题目描述] 给你一个长度为 n 的整数序列 {A1,A2,?,An},要求从中找出一段连续的长度不超过 m 的子序列,使得这个序列的和最大. [输入] 第一行为两个整数 n,m: 第二行为 n 个用空格分开的整数序列,每个数的绝对值都小于 1000. [输出] 仅一个整数,表示连续长度不超过 m 的最大子序列和. [输入样

分布式技术追踪 2017年第五十期

分布式系统实践 1. 系统设计高频:设计分布式文件系统Google File System https://mp.weixin.qq.com/s/RzPgT4eIEcqFOZM6xmDGpw 摘要: 这篇文章讲gfs的文章我觉得写的特别好, 不是一味的翻译文章, 而是从为什么讲到怎么做, 让我们可以更深刻的理解GFS的设计选择. 2. 拨开云雾见天日:数据库单机事务原理全解析 https://mp.weixin.qq.com/s/2JbhKAUxE1c4Cw7KXaGMvQ 摘要: 一篇详细介绍