二分图最大匹配(匈牙利算法)
2015-11-03 22:14
267 查看
二分图最大匹配有两种算法,最大流和匈牙利算法(又叫增广路算法)。
增广路算法的核心就是不断地找增广路,将增广路上的非匹配边变为匹配边,匹配边变为非匹配边,直到没有增广路。
下面是代码:
增广路算法的核心就是不断地找增广路,将增广路上的非匹配边变为匹配边,匹配边变为非匹配边,直到没有增广路。
下面是代码:
#include<iostream> #include<cstring> using namespace std; const int maxn = 1001; const int maxm = 1001; bool y[maxn],g[maxn][maxm]; int link[maxn]; int n1,n2,m,ans = 0; void init() { cin >> n1 >> n2 >> m; memset(link,-1,sizeof(link)); memset(g,0,sizeof(g)); for(int i = 0;i < m; i++ ) { int u,v; cin >> u >> v; g[u][v] = 1; } } bool find(int v) { for(int i = 0;i < n2; i++ ) if(g[v][i]&&!y[i]) { y[i] = true; if(link[i] = -1||find(link[i])) { link[i] = v; return true; } } return false; } int main() { init(); for(int i = 0;i < n1; i++ ) for(int j = 0;j < n2; j++ ) if(g[i][j]&&link[j] == -1) { link[j] = i; ans++; } for(int i = 0;i < n1; i++ ) { memset(y,0,sizeof(y)); if(find(i))ans++; } cout << ans; return 0; }
相关文章推荐
- 挂载光驱
- FTP服务器连接出现500错误
- 面向对象与面向过程
- Android - 使用Volley请求网络数据
- MOSS程序中如何发Mail?
- 2015-11-3-Training(for 2014th)
- socket(三)
- HDU 3613 Best Reward (manacher)
- iptables 命令介绍
- Linux软件安装方式
- word pattern
- OC-精简解读 block
- Android四大组件之Service
- 小甲鱼:Python学习笔记001_变量_分支_数据类型_运算符等基础
- 锋利的jQuery--表单等(读书笔记三)
- gbk 编码表
- PBOC-非接触小额支付扩展应用中R-MAC的计算
- Leiningen 与 maven
- String Date Calendar之间的转换
- Chapter02 控制结构和函数