当前位置: 首页 > news >正文

匈牙利算法

匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

之前在学离散的时候学习到二分图的时候没听说过这个算法,后来校级c程序设计大赛用到了二分图匹配才学习这个算法。

这个算法的目的就是找到使二分图能一 一配对的最大值。

比如给男女配对的时候要尽可能多的将互有好感的男女配对。

1、从编号为1的男生开始

2、找与他有暧昧关系的女生,标记女生。

3、判断该女生是否有男朋友,如果没有那这个男生就可以做她男朋友,返回真。

4、否则判断是否她的男朋友能不能从他其它有暧昧的女生里找到女朋友。(即重复2、3、4(递归))

5、可以,重新牵手,返回真。

6、否则返回假。

 

例题

问题 E: DATE ALIVE
时间限制: 1 Sec  内存限制: 128 MB
提交: 47  解决: 17
[提交][状态][讨论版]
题目描述

五河士道家里的精灵越来越多了,而每一个精灵都想和他有一个约会。然而五河士道却只有一个,无奈之下只能使出分身帮自己解围。

不过并不是所有的精灵都同意这样做,有些精灵不愿意和士道分身进行约会,也有部分精灵同时选择同一个分身进行约会。

假设有N个分身,精灵的数量为M,可能的约会组合有K组。

设N=3,M=5,K=5,可能的组合为1-1,1-3,2-4,3-4,3-5(如下图),为了避免冲突,我们最多可以选择1-1,2-4,3-5一共三种组合(或者是1-3,2-4,3-5)

那么请设计一个程序判断每一次可能的组队最多能确定多少队伍?最后,让我们的约会开始吧~

输入

输入N,M,K

N,M,K为正整数

1<=N<=500

1<=M<=500

接下来K行,输入u,v,表示uv之间愿意组队

u在N的范围内,v在M的范围内

输出

输出最大组队数目

样例输入
3 5 5
1 1
1 3
2 4
3 4
3 5
样例输出
3
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 int n,m,k;
 8 bool gx[550][550];
 9 int girl[550];
10 bool used[550];
11 bool dfs(int i){
12     for(int j=1;j<=m;j++){
13         if(gx[i][j]&&!used[j]){
14             used[j]=1;  //标记,避免后面无法跳出递归
15             if(!girl[j]||dfs(girl[j])){
16                 girl[j]=i;
17                 return true;
18             }
19         }
20     }
21     return false;
22 }
23 int hungary(){
24     int cnt=0;
25     for(int i=1;i<=n;i++){
26         memset(used,0,sizeof(used)); //清除标记
27         if(dfs(i))  cnt++;
28     }
29     return cnt;
30 }
31 int main(){
32     cin>>n>>m>>k;
33     while(k--){
34         int x,y;
35         scanf("%d%d",&x,&y);
36         gx[x][y]=true;
37     }
38     cout<<hungary()<<endl;
39     return 0;
40 }
 
 

 

题目链接http://oj.jxust.edu.cn/problem.php?cid=1251&pid=4

 

匈牙利算法其他详解:赞一个!http://blog.csdn.net/dark_scope/article/details/8880547


转载于:https://www.cnblogs.com/ISGuXing/p/8012478.html

相关文章:

  • 新站上线后 收录又被删掉的原因
  • 「前端」尚妆 UI 组件库工程实践(weex vue)
  • (转载)虚函数剖析
  • EBS adpatch logfile : log, lgi
  • WCF 有零个操作;协定必须至少有一个操作
  • Oracle EBS 如何生成trace文件
  • 《常微分方程教程》习题2.4.1,(4)
  • 掌握python机器学习-读书笔记4(特征选择)
  • JAVA中Get和Post请求的区别
  • Flask使用Flask-SQLAlchemy操作MySQL数据库
  • Windows Azure 网站上的 WebSocket 简介
  • 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(三)命令行工具集
  • 浅谈硬盘构造及IOPS的计算
  • 把用户加入sudo
  • 点滴积累【JS】---JS小功能(button选择颜色)
  • (三)从jvm层面了解线程的启动和停止
  • Android交互
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CentOS6 编译安装 redis-3.2.3
  • js 实现textarea输入字数提示
  • spring boot下thymeleaf全局静态变量配置
  • Spring Cloud中负载均衡器概览
  • spring security oauth2 password授权模式
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Vue--数据传输
  • Zepto.js源码学习之二
  • 闭包--闭包之tab栏切换(四)
  • 关于for循环的简单归纳
  • 开源SQL-on-Hadoop系统一览
  • 理解在java “”i=i++;”所发生的事情
  • 每天10道Java面试题,跟我走,offer有!
  • 前端面试之CSS3新特性
  • 使用SAX解析XML
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • AI算硅基生命吗,为什么?
  • 数据库巡检项
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $L^p$ 调和函数恒为零
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (4)Elastix图像配准:3D图像
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (数据结构)顺序表的定义
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .describe() python_Python-Win32com-Excel
  • .naturalWidth 和naturalHeight属性,
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc