二分图最大匹配--匈牙利算法
2015-02-23 14:09
323 查看
关于算法的讲解,个人觉得这篇博文写得非常好:http://blog.csdn.net/dark_scope/article/details/8880547
我的代码:
我的代码:
#include <cstdio> #include <vector> #include <cstring> using namespace std; #define MAXN 1005 vector<int> g[MAXN]; int n, m, color[MAXN], mm[MAXN]; bool used[MAXN]; bool isBiGraph(int x, int co) { bool ret = true; color[x] = co; int sz = g[x].size(); for(int i=0; i<sz; ++i) { int y = g[x][i]; if(color[y]<0) { ret = ret&&isBiGraph(y, co^1); if(!ret) return ret; } else if(color[y]==co) return false; } return ret; } bool findm(int x) { int sz = g[x].size(); for(int i=0; i<sz; ++i) { int y = g[x][i]; if(!used[y]) { used[y] = true; if(mm[y]==0 || findm(mm[y])) { mm[x] = y; mm[y] = x; return true; } } } return false; } void init() { for(int i=1; i<=n; ++i) g[i].clear(); memset(color+1, -1, n*sizeof(int)); memset(mm+1, 0, n*sizeof(int)); } int main() { while(scanf("%d%d", &n, &m)!=EOF) { init(); while(m--) { int u, v; scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } if(isBiGraph(1, 0)) { int ans = 0; for(int i=1; i<=n; ++i) { if(color[i]) { memset(used+1, 0, n); if(findm(i)) ++ans; } } printf("%d\n", ans); } else puts("0"); } return 0; }
相关文章推荐
- 二分图最大匹配(匈牙利算法)
- 二分图的最大匹配(匈牙利算法)
- poj3041二分图的最大匹配匈牙利算法
- [Matrix67]二分图最大匹配问题匈牙利算法
- POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现)
- 二分图最大匹配问题匈牙利算法
- (资料)二分图(偶图)最大匹配解法之一匈牙利算法
- Pku acm 3041 Asteroids 数据结构题目解题报告(十六)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- 二分图最大匹配 - 匈牙利算法
- 二分图最大匹配 匈牙利算法
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法 (二分图的最大匹配)
- Pku acm 1466 Girls and Boys数据结构题目解题报告(十七)---- 匈牙利算法求二分图的最大匹配
- 二分图的最大匹配匈牙利算法和最小支配集
- 用匈牙利算法求二分图的最大匹配
- 二分图最大匹配(匈牙利算法)
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- 二分图最大匹配 匈牙利算法 (自己写的模板)
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配