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

匈牙利算法是由匈牙利数学家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号男生腾出来一个妹子,我们实在是无能为力了……香吉士同学走好。

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

这就是匈牙利算法的流程,其中找妹子是个递归的过程,最最关键的字就是“腾”字

其原则大概是:有机会上,没机会创造机会也要上

【code】

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;
}

趣写算法系列之--匈牙利算法相关推荐

  1. 【匈牙利算法】【二分图匹配】【转载】趣写算法系列之--匈牙利算法

    转载自:http://blog.csdn.net/dark_scope/article/details/8880547 [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的 ...

  2. 【算法系列】卡尔曼滤波算法

    系列文章目录 ·[算法系列]卡尔曼滤波算法 ·[算法系列]非线性最小二乘求解-直接求解法 ·[算法系列]非线性最小二乘求解-梯度下降法 ·[算法系列]非线性最小二乘-高斯牛顿法 ·[算法系列]非线性最 ...

  3. 查找算法系列之复杂算法:哈希查找

    查找算法系列之复杂算法:哈希查找 眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/det ...

  4. 【老生谈算法】matlab实现匈牙利算法源码——匈牙利算法

    matlab匈牙利算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab匈牙利算法.doc 2.算法详解: ...

  5. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

  6. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

  7. 分治法的关键特征_算法系列之常用算法之一----分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...

  8. 算法系列教程04 - 算法相关的基础概念

    本系列前面两篇讲的都是一些背景知识,从这一篇开始我们正式讲算法,从算法的一些基本概念讲起. 什么是算法 通过上一篇对图灵机原理的讲解,我们知道,一个计算问题描述的是输入/输出之间的关系,如果根据给定的 ...

  9. 查找算法系列之复杂算法:二叉排序树BST

    前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1. ...

最新文章

  1. 创建型模式--抽象工厂模式
  2. FIlterInputStream和FilterOutputStream
  3. C#中用NPOI的excel导出
  4. ubuntu java sdk_ubuntu 10.10安装java sdk6过程
  5. java redis快速入门_SpringDataRedis快速入门
  6. 模板代码复用的三种方式: 宏, 继承, 包含
  7. P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)
  8. mysql怎么更改属性_MySQL 中怎么修改字段名,不更改属性?
  9. hdu 5833 Zhu and 772002 (高斯消元)
  10. java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架
  11. LapStyle - 基于拉普拉斯金字塔的高质量风格化方法 | CVPR2021
  12. 嵌入式开发之DSP学习
  13. python爬取公众号历史文章_微信公众号爬虫--历史文章
  14. CVPR2021 MotionRNN: A Flexible Model for Video Prediction with Spacetime-Varying Motions
  15. 公众号配图在哪里找?快来看看这里
  16. 生活总结[置顶] 程序员的奋斗史(十八)——人活着,只是一种态度
  17. Latex 插入大括号分类情况
  18. python 对图片进行颜色转换
  19. 上海南到金山卫22号线金山铁路最新时刻表
  20. 中机云告诉你,云计算有这10大好处|中机智库

热门文章

  1. 数据安全 | 黑产研究之拖库
  2. ipv6上ipv4网络并高速下载网盘资源
  3. 正则表达式-连续多位相同字符判断的正则表达式
  4. Navicat、PDMan、DBeaver三者ER图比较
  5. 【数据结构】最小生成树的概念
  6. Vhost Architecture
  7. MySQL安装报错:No compatible servers were found.You‘ll need to cancel this wizard and install one
  8. android获取时间戳接口
  9. Python内置函数!
  10. 项目管理之三点估算(正态分布)