二分图最大匹配——匈牙利算法
2014-03-05 23:19
246 查看
DFS实现,适用于稠密图:(复杂度O(VE))
BFS实现,适用于稀疏图:(复杂度O(V^3))
#include<bits/stdc++.h> using namespace std; const int mx = 105; vector<int> G[mx]; int match[mx]; ///match表示匹配的对象编号 bool vis[mx]; bool dfs(int i) { vis[i] = true; for (int j = 0; j < G[i].size(); ++j) { int v = G[i][j], mv = match[v]; if (mv < 0 || !vis[mv] && dfs(mv)) { match[v] = mv; match[mv] = v; return true; } } return false; } ///返回匹配的对数 int maxmatch(int n) { int ans = 0; memset(match, -1, sizeof(match)); for (int i = 0; i < n; ++i) if (match[i] < 0) { memset(vis, 0, sizeof(vis)); if (dfs(i)) ++ans; } return ans; }
BFS实现,适用于稀疏图:(复杂度O(V^3))
#include<bits/stdc++.h> using namespace std; const int mx = 105; int G[mx][mx]; int cx[mx], cy[mx]; ///匹配的对象编号 int pred[mx]; /// 记录交错轨和标记Y集合中访问过的点 int q[mx]; ///queue int maxmatch(int nx, int ny) { int ans = 0, y, sta, fin, i, j; memset(cx, -1, sizeof(cx)); memset(cy, -1, sizeof(cy)); for (i = 0; i < nx; ++i) { if (cx[i] != -1) continue; ///对x中的每个未盖点i执行一次bfs找交错轨 fill(pred, pred + ny, -2); ///初始值 sta = fin = 0; for (j = 0; j < ny; ++j) ///把i的邻接点加入队列 if (G[i][j]) { pred[j] = -1; ///-1表示遍历到,是邻接点 q[fin++] = j; } while (sta < fin) ///BFS { y = q[sta]; if (cy[y] == -1) break; ///找到了一个未匹配点,即找到了一条交错轨 ///若没break说明y已经被匹配给了cy[y]了 ++sta; for (j = 0; j < ny; ++j) if (pred[j] == -2 && G[cy[y]][j]) ///从cy[y]出发,将它的邻接顶点加入队列 { pred[j] = y; q[fin++] = j; } } if (sta == fin) continue; ///未找到交错轨 while (pred[y] >= 0) ///更改交错轨上的匹配状态 { cx[cy[pred[y]]] = y; cy[y] = cy[pred[y]]; y = pred[y]; } cx[i] = y, cy[y] = i; ++ans; } return ans; }
相关文章推荐
- 二分图的最大匹配——网络流+匈牙利算法
- 用匈牙利算法求二分图的最大匹配
- 二分图最大匹配算法-匈牙利算法
- 算法练习系列—hiho1122二分图最大匹配之匈牙利算法
- 二分图的最大匹配、完美匹配和匈牙利算法
- [HPU] 机房的位置(三)[二分图最大匹配][匈牙利算法]
- 4000 二分图最大匹配(匈牙利算法)
- 求二分图最大匹配——匈牙利算法模板。
- 【模板】匈牙利算法 二分图最大匹配题模板
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
- POJ 3041 Asteroids 匈牙利算法 二分图最大匹配
- hdu5090 匈牙利算法二分图最大匹配问题
- POJ 1469 COURSES【匈牙利算法入门 二分图的最大匹配 模板题】
- 二分图最大匹配的匈牙利算法
- POJ1274:The Perfect Stall(二分图最大匹配 匈牙利算法)
- HDOJ---1151 Air Raid[匈牙利算法:最小路径覆盖数=原图顶点数–二分图最大匹配数]
- 【二分图|最大匹配】POJ-3041 Asteroids(匈牙利算法dfs、bfs版)
- 二分图最大匹配:匈牙利算法的python实现
- 【HDU2063】过山车(二分图最大匹配,匈牙利算法)
- POJ1469(匈牙利算法求二分图最大匹配)