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

先介绍一下增广路径:若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。文字难以理解,看图:

首先 假设 图G中已经两两匹配了4个点 即 M 中 又 (1,A)(4,C)两条边;

然后路径p是一条连接未匹配点2和D的一条路径 其中属于M的边和不属于M的边交错:(2-A-1-C-4-D),这样就称p为M的一条增广路径;

增广路径的性质:

1-P的路径长度必定为奇数,第一条边和最后一条边都不属于M。

2-不断寻找增广路可以得到一个更大的匹配M’,直到找不到更多的增广路。

3-M为G的最大匹配当且仅当不存在M的增广路径。

4-最大匹配数M+最大独立数N=总的结点数。

我们将P中不属于M的路径加入M,将原来属于M的路径去除。M的匹配数增加到了 3,如果我们一只找M的增广路径然后取反,直到M没有增广路,这时我们就找到了M的最大匹配数,这也时 匈牙利算法的核心所在;

      匈牙利算法 :首先向M中增加一条路径,然后一只寻找M的增广路径直到M中不存在增广路径为止,这时我们就完成了最大匹配的寻找。

      用一个问题来展现匈牙利算法:

      假设有一群人生了不同的病(一个人只能生一种病),这里有多种可以治病的药丸,并且一种药丸只能治一种病且仅有一个,问最多能救治多少人;

      输入 :在第一行中给出 n ,m, k 其中 n是人数,m 是 药的种类数,k是 人和药共有多少种匹配,然后 跟着 k 行,每行 一个 整数:人的标号,一个字符 :药的种类。

      输出:在一行中输出最多可以救治多少人。

      代码:

//二分图最大匹配-匈牙利算法
#include<stdio.h>
#include<string.h>
#define MAXN 100       //定义最大人数
#define TYPE 6        //定义药的种类数
int map[MAXN][MAXN]; //用来储存人和药的关系
int vis[MAXN];      //用来标记药的被使用人
int used[MAXN];    //用在递归的时候标记修改的药的种类
char array[6] = {'a','b','c','d','e','f'};
int GetPos(char x){ //获取药的索引 int i, position;for (i=0;i<TYPE;i++){if (array[i] == x)return i; // 找到的话就返回索引 }return -1; // 找不到就返回-1
}
void init(){ // 初始化函数 memset(map,-1,sizeof(map));memset(vis,-1,sizeof(vis));memset(used,-1,sizeof(used));
}
int MaxMatch(int n){ // n是人的代号 int i;for (i=0;i<TYPE;i++){if ( used[i]==-1 && map[n][i]==1) //寻找增广路 {used[i] = 1;   if (vis[i] == -1||MaxMatch(vis[i])==1){vis[i] = n;return 1;}}}return -1;
}
int main (){int n, m, i, k, cnt = 0, b, index;//n是患病的人数,m是药的种类数,i是循环变量,k是人和药对应关系的数量,cnt记录最大匹配数,b是某人的代号,index记录药的位置 char a; //a是药的品种 scanf("%d%d%d",&n,&m,&k);init();for (i=0;i<k;i++){scanf("%d %c",&b,&a);index = GetPos(a);map[b][index] = 1;}for (i=1;i<=n;i++){memset(used,-1,sizeof(used));//每次都要初始化一遍 每次寻找增广路都与之前无关 if (MaxMatch(i)==1)cnt++;}printf("%d\n",cnt);
}

二分图最大匹配-匈牙利算法相关推荐

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

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

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

    问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...

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

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

  4. 二分图最大匹配(匈牙利算法Dinic算法)

    二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...

  5. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  6. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)

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

  7. NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )

    描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...

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

    Algorithm.( Augmenting Path Algorithm ) Input:     An X-Y bigraph G, a matching M in G,     and the ...

  9. [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2819 题意:给一张n*n的01矩阵,可以任意交换其中的行或者列,问是否可以交换出来一个对角 ...

最新文章

  1. arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...
  2. 720环物全景制作_什么是全景?关于360°全景和720°全景的区别你知道吗?
  3. Android实现支付宝AR功能,Android RecyclerView 实现支付宝首页效果
  4. .net core DI 注册 Lazy 类型
  5. redis php 性能测试工具,redis性能测试与客户端连接详解
  6. mysql 极限优化配置_MySQL优化(二) 优化诀窍
  7. SQL中 NVL()函数的使用
  8. 一元线性回归原理及python简单实现
  9. 测序技术的一些原理理解(sanger测序与illumina测序)
  10. python二级真题--共十二套--前六套--选择题
  11. 使用xpath,正则表达式爬取豆瓣top250电影信息
  12. 【JS】console.log()打印出五彩斑斓的黑
  13. Elasticsearch系列01:基础教程
  14. Flask 学习-22.可插拨视图MethodView类
  15. 相信积累的力量——《把时间当作朋友》读后感
  16. 深度学习与神经科学相遇
  17. flash特效原理 图片滑动放大效果
  18. (7)stata的基本使用--受限被解释变量
  19. Dreamweaver教程从入门到精通 html篮球网站制作 学生静态网页作业源码模板
  20. BitStorm Lite-国产的 BT 下载客户端

热门文章

  1. 源码分析学习记录(5)——骨骼存储与建立
  2. centos7 wget 安装git
  3. 修炼功法错了,再怎么努力修炼效率还是很低!
  4. 越权、cookie与session、认证和授权
  5. 关于DB2数据库工作中常用的语法总结
  6. 美国主机高级安全配置有哪些
  7. 个人开发者盈利行业潜规则!你知道几条?
  8. BWP切换过程中的频域资源指示
  9. paddleOCR票据识别(一)
  10. QT 5.12安装教程