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

转载自: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rest Framework

目录导航 一、RESTful 规范 二、APIView 组件 三、序列化组件 四、认证组件 五、权限组件 六、频率组件 七、分页器组件 一、RESTful 规范 什么是RESTful规范&#xff1a; REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transf…

[剑指offer][JAVA]面试题第[26]题[树的子结构][递归]

【问题描述】[中等] 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。例如: 给定的树 A:3/ \4 5/ \1 2 给定的树 B&#xff1a;4 /1 返回 true&#xff0c;因为 B 与…

二分图最大匹配的König定理及其证明

出处:http://www.matrix67.com/blog/archives/116 二分图最大匹配的Knig定理及其证明 如果你看不清楚第二个字母&#xff0c;下面有一个大号字体版本&#xff1a; 二分图最大匹配的Knig定理及其证明 本文将是这一系列里最短的一篇&#xff0c;因为我只打算把Knig定理证了…

【插件介绍】Lombok

Lombok ​ Lombok项目是一个Java库&#xff0c;它会自动插入编辑器和构建工具中&#xff0c;Lombok提供了一组有用的注释&#xff0c;用来消除Java类中的大量样板代码。仅五个字符(Data)就可以替换数百行代码从而产生干净&#xff0c;简洁且易于维护的Java类。 使用步骤&…

图像增强概述

问题背景&#xff08;Background&#xff09; 曝光不足或过度的照片-需要增强处理 图像Fourier频谱看不清-需要增强处理 图像有雾-需要 增强处理 车牌识别系统 车牌识别预处理-车牌图像需要增强处理 人脸识别预处理-人脸图像需要增强处理 指纹识别预处理-指纹图像需要增强处理…

并查集入门

quick-find 时间复杂度 quick-union quick-find&#xfffc;时间复杂度&#xfffc;### quick-union&#xfffc; &#xfffc; 按SIZE合并 按秩合并 路径压缩 面试了解基本思想 做蓝色 写路径隔代压缩 转载链&#xff1a;https://liweiwei1419.gitee.io/leetcode-algo/

Java学习笔记10-2——MyBatis

文章目录MyBatis详细执行流程使用注解开发面向接口开发使用注解开发复杂查询多对一问题测试环境搭建按照查询嵌套处理&#xff08;子查询、嵌套查询&#xff09;按照结果查询&#xff08;联表查询、联合查询&#xff09;一对多问题环境搭建按照结果查询&#xff08;联表查询、联…

基于直方图处理的图像增强

灰度图像的直方图 •灰度级直方图是图像的一种统计表达&#xff0c;它反映了该图中 不同灰度级出现的统计概率。 •设图像具有L个灰度级&#xff0c;图像中像素点的个数为n&#xff0c;它 的第k个灰度级出现的次数为(k0,1,2,…,L-1) 通过直方图可以看出图像整体的性质 直方图…

[Leedcode][JAVA][第1014题][最佳观光组合][数组][暴力优化]

【问题描述】[中等] 给定正整数数组 A&#xff0c;A[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的距离为 j - i。一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为&#xff08;A[i] A[j] i - j&#xff09;&#xff1a;景点的评分之…

NLayerAppV3--.net Core2实现的DDD分层架构

虽然每天的工作都是CURD、还是使用着传统的三层架构、使用着.net Framework&#xff0c;但是这并不能影响我学习DDD和.net core。 总是希望软件在应对复杂多变的场景时能够游刃有余&#xff0c;在解决问题时能够多一种选择。 很早就有关注大神dax.net的NLayerApp系列博文https:…

Java学习笔记11-1——Spring5

文章目录1.简介组成拓展2.控制反转&#xff08;IoC&#xff09;IoC例子IoC本质3.Hello&#xff0c;Springdemo1修改user例子的代码思考4.IoC创建对象的方式通过无参构造的方式通过有参构造的方式5.Spring配置alias 设置别名Bean的配置import6.依赖注入&#xff08;DI&#xff0…

空间滤波增强

基本概念 空间域滤波增强采用模板处理方法对图像进行 滤波&#xff0c;去除图像噪声或增强图像的细节 空间域平滑滤波器 分析&#xff1a;任何一幅原始图像&#xff0c;在其获取和传输等过程中&#xff0c; 会受到各种噪声的干扰&#xff0c;使图像模糊&#xff0c;对图像分析…

[剑指offer][JAVA]面试题第[27]题[二叉树的镜像][递归][栈]

【问题描述】[中等] 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。例如输入&#xff1a;4/ \2 7/ \ / \ 1 3 6 9 镜像输出&#xff1a;4/ \7 2/ \ / \ 9 6 3 1示例 1&#xff1a;输入&#xff1a;root [4,2,7,1,3,6,9]…

瓶颈分析

Top指令&#xff1a; CPU/内存情况 top # top指令可以显示总体CPU占用率、内存使用率和交换情况&#xff0c;以及所有进程对应的CPU、内存占用情况 终端下使用该指令示例结果&#xff1a; 上图对一些重要的参数进行了简单标识&#xff0c;笔者这里使用的是XShell对远程Linux服务…

Java学习笔记11-2——Spring5

文章目录7.Bean的自动装配自动装配说明测试环境搭建byName&#xff08;按名称自动装配&#xff09;测试byName运行机制小结&#xff1a;byType&#xff08;按类型自动装配&#xff09;测试使用注解进行自动装配AutowiredQualifierResourceAutowired与Resource异同8.使用注解开发…

频率域平滑滤波器

频率域滤波增强方法 理想低通滤波器 理想低通滤波器(Ideal Lowpass Filters-ILPF) 尽管理想低通滤波器在数学上定义清楚&#xff0c;在计算机模拟中也可 实现&#xff0c;但在截止频率处直上直下的理想低通滤波器是不能用实际的 电子器件实现的。 理想滤波器有陡峭频率的截止…

[leetcode][JAVA]面试题第[1028]题[迭代]

【问题描述】[困难] 我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处&#xff0c;我们输出 D 条短划线&#xff08;其中 D 是该节点的深度&#xff09;&#xff0c;然后输出该节点的值。&#xff08;如果节点的深度为 D&#xff0c;则其直接子节点的…

频率域锐化滤波器

频率域锐化滤波器 &#xff08;Frequency Sharpening Filters &#xff09; 图像的边缘、细节主要位于高频部分&#xff0c;而图 像的模糊是由于高频成分比较弱产生的。 频率域锐化就是为了消除模糊&#xff0c;突出边缘。 采用高通滤波器让高频成分通过&#xff0c;使低频成 …

6用NetBeans进行JSP开发

用NetBeans进行JSP开发 NetBeans