匈牙利算法是由匈牙利数学家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;
}

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

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

原博客:https://blog.csdn.net/dark_scope/article/details/8880547

算法讲解 -- 二分图之 匈牙利算法相关推荐

  1. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  2. 二分图最大匹配—匈牙利算法

    二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...

  3. 二分图匹配——匈牙利算法

    匈牙利算法 什么是匈牙利算法 匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法.美国数学家哈罗德·库恩于1955年提出该算法.此算法之所以被称作匈牙利算法,是因 ...

  4. 二分图最大匹配——匈牙利算法

    二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...

  5. 二分图最大匹配-匈牙利算法

    今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...

  6. 二分图匹配-匈牙利算法

    说到二分,我们就很容易想到二分查找算法,今年下半年--,今天所介绍的二分图和二分查找没有太大的联系,我们先来看一下它的定义: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图 ...

  7. 图论二分图问题讲解-染色法和匈牙利算法

    二分图 概述: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两 ...

  8. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  9. 二分图匹配--匈牙利算法

    文章目录 二分图: 匹配 匈牙利算法 代码: 二分图: 二分图是一个无向图,点集分成子集X和Y,图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时(包括0),G就是一个二分图 ...

最新文章

  1. 转:各种专题图实现的C#源代码
  2. ASP.NET中MVC默认模板的项目结构
  3. Android API 中文(77)——AdapterView.OnItemSelectedListener
  4. How Setting Show Transaction Code on SAP Tree Menu Side.
  5. Linux之wget命令详解
  6. store.js - 轻松实现本地存储(LocalStorage)
  7. dump排查内存异常 java_如何排查Java应用内存泄漏问题
  8. OpenFaces 3.0 最终版本发布,支持JSF2.0
  9. live2d动态壁纸android,Live2d动态壁纸
  10. 上海企业英语培训机构排名
  11. 计算机二级纸张b5大小,b5的尺寸(a4a5b5纸张大小对比)
  12. 两台主机如何共享一套键鼠一台显示器?
  13. Windows api实现桌面任务栏隐藏\显示
  14. 数据库的锁机制理解和运用
  15. Android WiFi系统【转】
  16. mac悬浮窗_Mac OS 悬浮窗口,并且可以保持在全屏的其他应用上。
  17. 第一行代码——Android pdf
  18. 实时时钟模块RX-8010SJ
  19. 15个“在线配色方案”工具网站
  20. 2022-08-18 mysql/stonedb-aggregate场景group by分析

热门文章

  1. [能力提升][费曼学习法]学习方法
  2. linux不支持32,Visual Studio Code 1.36发布,不再支持Linux 32位
  3. Eclipse查找文件存储路径
  4. cesium添加填充_Cesium中级教程1 - 空间数据可视化(一)
  5. python postgresql跨数据库查询_python访问PostgreSQL数据库之连接库Psycopg2
  6. php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案
  7. IDE--ubuntu下安装 Source insight
  8. 基于半同步/半反应堆线程池实现的HTTP解析服务端程序
  9. Linux Arch目录下处理器体系架构介绍
  10. 如何保证战略落地_如何让战略落地:流程管理的道法术器让战略落地提升竞争力...