一天一算法

二分图的匹配算法——最大匹配

基本概念:

二分图本身的概念就不解释了。这里主要介绍一下增广路。也有人称它为交错路。之所以称它为交错路是因为在这条路径上,未匹配边和匹配边是交替出现的。之所以称它为增广路,是因为如果能找到这条路,就能够使得匹配数加一。事实上,他的名字就是增广路的性质的体现。我们把二分图中的点分为左边和右边。增广路的理解,就是,一个未匹配点a(左边)到另一个未匹配点b(右边)的一条路径。这条路径满足上述的交错的性质。

KM算法

:在求二分图的匹配中,一个基本的算法就是KM算法。KM的算法核心思想,就是寻找增广路。因为,每找到一条增广路,那么匹配数就会多1.所以,那么就一直找增广路,直到找不到为止。找不到的时候,得到的就是最大匹配数了和相应的匹配了。

KM算法运行步骤的文字描述:

我觉得初学者看到这里还是不明白KM算法到底是怎么操作的。那么,我用文字来大致的描述一下。
假设我们现在要给n1(左边)找一个匹配点。我们首先遍历a的相邻点。加入我们找到了一个点。称它为n2(右边).如果n2(右边)没有匹配,则我们就已经找到了一条增广路(看上文的定义)。如果n2(右边)已经匹配,并且我们设他匹配的点是n3(左边),那么我们就尝试着找一条增广路。找增广路的本质,就是我们要找一种调整方案。把我们原先的匹配的方案在调整一下,尽可能使得当前的点也可有匹配的点。

那么怎么调整呢。接下来我用拟人来描写。:)我们假设n1(左)和n2(右)匹配。但是n2(右)和n3(左)在之前就匹配了,所以,为了不让n3(左)生气,我们还得再给n3(左)找一个匹配点。如果n3没有找到匹配点,那么我们就还按照原来的匹配方案匹配。因为这样谁也不得罪。但是,如果n3(左)找到了一个匹配点,我们叫他n4(右),那么我们就调整,让n3(左)去和n4(右)匹配,n1(左)和n2(右)匹配。这样一来,我们不就多了一个匹配吗?那么问题来了,怎么给n3(左)找匹配点呢?很显然,在计算机看来,n3(左)和n1(左)没有任何区别不是吗?你怎么给n1找,你就怎么给n3找不就得了。仍然是,遍历相邻的点,我们找到一个点n4,如果n4没有匹配,那么就让n3和n4匹配。如果,n4已经匹配…………代码经验多的同志们可能就看出来了,这实际上就是递归的过程。当然,KM算法,也有非递归的形式。但这样理解无妨。

复杂度分析

KM算法的理论复杂度是O(VE).当然,这取决与你的实现方式。KM有BFS实现方式和DFS实现方式。总体而言,BFS是较好的。尤其是在稀疏图中。BFS有明显的优势。

同时较好的存图方式应该是采用邻接表。要实现邻接表。可以借助容器vector ,当然,这样会浪费一些空间,因为vector不能动态的申请大小,也可以自己实现。在接下来的代码展示中,我会采用容器实现,以求方便。并给出不用容器实现邻接表的c++代码。

Talk’s cheap ,show me the code

//首先给出邻接表的完成
#include<iostream>
struct Link{int node;struct Link *next;Link(){node=-1;next=NULL;}
};
struct _Node{

详解二分图的最大匹配相关推荐

  1. 奔小康赚大钱 HDU - 2255( 二分图匹配KM算法详解)

    题目 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.  这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百 ...

  2. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  3. 让理科生沉默,让文科生流泪的综合题详解

    让理科生沉默,让文科生流泪的综合题详解 阿布evo 发表于  2011-05-09 21:34 原文地址:http://www.guokr.com/article/31315/ 这套题就是前两天在校内 ...

  4. 让理科生沉默,让文科生流泪的综合题详解(转,即原来有园友发过的程序员试题)...

    这套题就是前两天在校内上看到的,原作者是上海交通大学的李垚同学,原文在 这里 .于是考据癖大发作,就耗了7个小时写了下面这些东西.答案只是我自己写的,也并不是 官方的正确答案 ,括号里附上了一些说明, ...

  5. 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

    多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大 ...

  6. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  7. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可 ...

  8. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

  9. linux下weblogic版本,Linux下weblogic10.3.6(jar)版本安装详解

    一.安装前的准备 安装weblogic是需要JDK环境的,虽然weblogic有自带的JDK,但是我一般是自己选择JDK进行安装,如果你要自行安装,可以参考我的另一篇博客 https://www.cn ...

  10. php vimrc配置文件,vim技巧:我的 .vimrc 配置文件,详解每一个配置项的作用

    下面是我的 .vimrc 配置文件,每一个配置项都添加了注释说明,详解每一个配置项的作用,以便确认为什么要添加这个配置项. " 使用vim的modeline来设置当前文件的textwidth ...

最新文章

  1. jquery ajax统一对url编码,jQuery AJAX请求中的相对与绝对URL
  2. lvm讲解和磁盘故障案例
  3. 什么是接口幂等性?为什么会产生这个问题?如何保证接口幂等性?
  4. 我的第一个MapReduce程序(WordCount)
  5. hdu 4763 Theme Section(next数组找串中三段相等)
  6. 转载:Linux 的系统服务及其配置(略有修改)
  7. matlab无限循环怎么停下来,[求助] 关于matlab无限循环的问题
  8. ajax是操作系统吗,ajax 跟post 可以设置它是否同步执行
  9. 安卓逆向_22( 一 ) --- Xposed【 Android Studio + Xposed 实现简单的 hook 】
  10. matlab cell向量匹配向量,根据2个cell格式数据中的某二列进行匹配并合并
  11. 词法分析之LED文件生成程序【调试中......】
  12. crm登录系统是什么系统?
  13. 解决Chrome浏览器登录web系统一直报“验证码错误问题“
  14. 广东省清远市谷歌卫星地图下载
  15. 生活随记 - 拥抱变化
  16. KM3模拟键盘鼠标模块使用说明---2.键盘功能
  17. 微信图片去除马赛克_微信怎么把图片加上马赛克_微信如何将照片打码的方法介绍_3DM手游...
  18. Java 开发中遇到的印象深刻的问题
  19. office2016无法打开新建的Excel表格,但是能打开以前新建的,解决办法如下
  20. 【NOI2007】社交网络

热门文章

  1. 基于android的手机银行app毕设项目
  2. 面向对象程序设计·学习笔记(2/2)
  3. 内核block层IO调度器—bfq算法之3源码要点总结
  4. cocosCreator 之 ScrollView的基本使用
  5. 热点丨智链万源成为国家动物健康与食品安全创新联盟理事单位
  6. java修改显示原值_项目中copy List 数据,解决修改值后改变原值问题(SerialKiller)...
  7. 英国欲出新规 将“经济控制”列入家庭暴力
  8. 期望DP——景区路线规划
  9. 运营支撑系统(BSS)在面向物联网IoT业务场景的模型简要分析和设计
  10. Vue 实现省市区三级联动选择(附带JSON数据)