转载自:http://blog.csdn.net/dark_scope/article/details/8880547

【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 
——-等等,看得头大?那么请看下面的版本:

通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(惊讶-_-||暂时不考虑特殊的性取向),如果一对男女互有好感,那么你就可以把这一对撮合在一起,现在让我们无视掉所有的单相思(好忧伤的感觉快哭了),你拥有的大概就是下面这样一张关系图,每一条连线都表示互有好感。

本着救人一命,胜造七级浮屠的原则,你想要尽可能地撮合更多的情侣,匈牙利算法的工作模式会教你这样做:

===============================================================================

一: 先试着给1号男生找妹子,发现第一个和他相连的1号女生还名花无主,got it,连上一条蓝线 

===============================================================================

二:接着给2号男生找妹子,发现第一个和他相连的2号女生名花无主,got it 

===============================================================================

三:接下来是3号男生,很遗憾1号女生已经有主了,怎么办呢?

我们试着给之前1号女生匹配的男生(也就是1号男生)另外分配一个妹子。

(黄色表示这条边被临时拆掉) 

与1号男生相连的第二个女生是2号女生,但是2号女生也有主了,怎么办呢?我们再试着给2号女生的原配(发火发火)重新找个妹子(注意这个步骤和上面是一样的,这是一个递归的过程) 

此时发现2号男生还能找到3号女生,那么之前的问题迎刃而解了,回溯回去

2号男生可以找3号妹子 
 
1号男生可以找2号妹子了 
 
3号男生可以找1号妹子 

所以第三步最后的结果就是: 

===============================================================================

四: 接下来是4号男生,很遗憾,按照第三步的节奏我们没法给4号男生腾出来一个妹子,我们实在是无能为力了……香吉士同学走好。

===============================================================================

这就是匈牙利算法的流程,其中找妹子是个递归的过程,最最关键的字就是“腾”字 
其原则大概是:有机会上,没机会创造机会也要上

bool find(int x){  int i,j;  for (j=1;j<=m;j++){    //扫描每个妹子  if (line[x][j]==true && used[j]==false)        //如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)  {  used[j]=1;  if (girl[j]==0 || find(girl[j])) {   //名花无主或者能腾出个位置来,这里使用递归  girl[j]=x;  return true;  }  }  }  return false;
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在主程序我们这样做:每一步相当于我们上面描述的一二三四中的一步

for (i=1;i<=n;i++)
{  memset(used,0,sizeof(used));    //这个在每一步中清空  if find(i) all+=1;
}  
  • 1
  • 2
  • 3
  • 4
  • 5

【匈牙利算法】【二分图匹配】【转载】趣写算法系列之--匈牙利算法相关推荐

  1. NOI图论算法:二分图匹配

    二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 https://www.bilibili.com/video/BV1j5411x7PU SWPU-ACM每周算法讲堂-匈牙利算法 ...

  2. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  3. em算法怎么对应原有分类_机器学习系列之EM算法

    我讲EM算法的大概流程主要三部分:需要的预备知识.EM算法详解和对EM算法的改进. 一.EM算法的预备知识 1.极大似然估计 (1)举例说明:经典问题--学生身高问题 我们需要调查我们学校的男生和女生 ...

  4. std中稳定排序算法_实战c++中的vector系列--使用sort算法对vector进行排序(对vector排序、使用稳定的排序std::stable_sort())...

    写了挺多关于vector的操作了,正好工作中遇到对vector进行排序的问题,这里就讨论一下. 直接使用sort算法,那就先了解一下: template void sort (RandomAccess ...

  5. 【HDU - 5943】Kingdom of Obsession(数论,素数间隔结论,构造,思维,匈牙利算法,匹配问题)

    题干: There is a kindom of obsession, so people in this kingdom do things very strictly. They name the ...

  6. 【Step1】【二分图匹配】poj 1274-The Perfect Stall

    题目链接 题目大意 输入数据中,第一行给出n,表示n个奶牛. 接下来n行,每行一个x,xi表示第i头奶牛可以选择x个谷仓中的一个进行匹配.接下来x个数,表示谷仓的编号(1~n之间) 一个谷仓也只能有一 ...

  7. TZOJ 3030 Courses(二分图匹配)

    描述 Consider a group of N students and P courses. Each student visits zero, one or more than one cour ...

  8. [BZOJ2150]部落战争-二分图匹配

    部落战争 Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个MN的矩阵,其中某些地方是城镇,某些地方是高山深涧无人 ...

  9. NetworkX系列教程(10)-算法之三:关键路径问题

    小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...

  10. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

最新文章

  1. Shader 中的随机与噪声
  2. noip2016普及组 魔法阵vijos2012
  3. mac pro下安装gdb和delve调试器
  4. Python数组操作2
  5. 《Android传感器开发与智能设备案例实战》——第2章,第2.4节安装ADT
  6. linux里的挂载错误无法开机怎么办,Linux基础知识 - 开机挂载错误
  7. linux 删除分区_详解linux系统架构--文件系统体系
  8. Git - Pull Request工作流
  9. python爬虫要不要学正则_Python爬虫入门,如何使用正则表达式
  10. 点击按钮回到页面顶部或者某个高度时的问题,JQUERY
  11. html——name与value的使用
  12. 【ZooKeeper Notes 5】单机启动多个zk实例注意点
  13. [kuangbin带你飞] 专题一简单搜索
  14. 将linux文件拷贝到windows,Windows与Linux系统拷贝文件之pscp的使用分享
  15. 教你如何AMPL自动求解tsp问题
  16. 财务管理与计算机论文,计算机小论文--浅论计算机与财务管理.doc
  17. Nova 组件如何协同工作 - 每天5分钟玩转 OpenStack(24)
  18. HDU 5745 La Vie en rose(bitset优化dp)
  19. 华为荣耀20和x10比较_华为畅享20Pro和荣耀X10哪个好-有什么区别-哪个性价比高
  20. PCB板子焊接注意事项及小技巧

热门文章

  1. 8.最大公约数和最小公倍数问题
  2. php curl获取登陆cookie,PHP curl 模拟登陆 获取cookie
  3. java base64转bitmap,如何将Bitmap位图与base64字符串相互转换
  4. cesium事件简单全面描述
  5. typescript 动态给class添加方法
  6. r语言rank降序_R语言rank函数详细解析
  7. Php的https方法,php获取https协议内容的两种方法
  8. MySQL根据某一个或者多个字段查找重复数据
  9. 山师2019计算机真题,2019山师附中推荐生面谈真题(山东师范大学附属中学)
  10. 谭浩强c语言规范化的指数形式,C语言程序设计谭浩强第四期末复习重点.docx