【模板】匈牙利算法 二分图最大匹配题模板
来源:互联网 发布:系统数据流程图 编辑:程序博客网 时间:2024/05/22 17:08
【任务】
给定一个二分图,用匈牙利算法求这个二分图的最大匹配数。
【说明】
求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配。
我们一次枚举左边的点x的所有出边指向的点y,
若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一,
否则我们试图给原来匹配的y和x’重新找一个匹配,如果x’匹配成功,那么(x,y)就可以新增为一对合法的匹配。
给x’寻找匹配的过程可以递归解决。
【接口】
int hungary();
复杂度O(|E|*sqrt(|V|))
输入: n 全局变量,左侧的点数
g 全局变量,g[i]表示与左边点i相连的右边的点
输出:tot 最大匹配数
from 全局变量,from[i]表示最大匹配图中与左边点i相连的边
【代码】
//输入:const int MAXN = 555; // 数组长度int n = 200; //n表示左侧的点数vector <int> g[MAXN]; // 表示与左边点i相连的右边点//输出:int from[MAXN];//表示最大匹配中与左边点i相连的边int tot; // 二分图最大匹配数bool use[MAXN]; // 左边点的使用标记//匈牙利算法 模板题 ,match和hungary见小红书ACM国际大学生程序设计竞赛 算法与实现bool match(int x){ for(int i = 0;i < g[x].size(); ++i){ if(!use[g[x][i]]){ use[g[x][i]] = true; if(from[g[x][i]] == -1 || match(from[g[x][i]])){ from[g[x][i]] = x; return true; } } } return false;}int hungary(){ tot = 0; memset(from,255,sizeof(from)); for(int i = 1;i <= n; i++){ memset(use,0,sizeof(use)); if(match(i)) ++tot; } return tot;}
这个我打算写给自己写题学习时用的,发出来供大家参考。
样题:http://www.cnblogs.com/zhangjiuding/p/7538564.html
阅读全文
0 0
- 【模板】匈牙利算法 二分图最大匹配题模板
- 二分图最大匹配模板(匈牙利算法)
- 匈牙利算法模板 二分图最大匹配
- 匈牙利算法,二分图最大匹配、多重匹配模板
- 二分图最大匹配算法-匈牙利算法(Hungary)模板
- 【二分图最大匹配-匈牙利算法及其优化算法模板】
- 二分图最大匹配 匈牙利算法 (自己写的模板)
- 透彻解析二分图最大匹配匈牙利算法模板
- 二分图最大匹配之匈牙利算法模板
- POJ1274 匈牙利算法 最大二分图匹配入门模板
- 二分图最大匹配(匈牙利算法-DFS增广模板)
- 【模板】匈牙利算法——二分图最大匹配
- 【匈牙利算法】二分图最大匹配(模板)
- 匈牙利算法(二分图匹配)模板
- 二分图匹配(匈牙利算法模板)
- 【二分匹配匈牙利算法模板】
- 匈牙利算法求二分图的最大匹配/匈牙利算法模板
- POJ 1469 COURSES【匈牙利算法入门 二分图的最大匹配 模板题】
- centos 6.5安装nodejs全记录
- java内存分配规则
- 属性动画案例:雅虎加载视差动画
- redis
- 欢迎使用CSDN-markdown编辑器
- 【模板】匈牙利算法 二分图最大匹配题模板
- 转了一篇能看明白的闭包
- 银联支付
- URAL 1960- Palindromes and Super Abilities (回文树)
- windows内网文件共享
- SQL 的四大连接方式
- 4.3 数据的格式化键盘输入习题4
- shell 单实例(2)
- 初步学习c语言