二分图最小点覆盖模版(LRJ)
2013-03-19 13:19
471 查看
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 1000 + 5; // 单侧顶点的最大数目 // 二分图最大基数匹配 struct BPM { int n, m; // 左右顶点个数 vector<int> G[maxn]; // 邻接表 int left[maxn]; // left[i]为右边第i个点的匹配点编号,-1表示不存在 bool T[maxn]; // T[i]为右边第i个点是否已标记 int right[maxn]; // 求最小覆盖用 bool S[maxn]; // 求最小覆盖用 void init(int n, int m) { this->n = n; this->m = m; for(int i = 0; i < n; i++) G[i].clear(); } void AddEdge(int u, int v) { G[u].push_back(v); } bool match(int u){ S[u] = true; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (!T[v]){ T[v] = true; if (left[v] == -1 || match(left[v])){ left[v] = u; right[u] = v; return true; } } } return false; } // 求最大匹配 int solve() { memset(left, -1, sizeof(left)); memset(right, -1, sizeof(right)); int ans = 0; for(int u = 0; u < n; u++) { // 从左边结点u开始增广 memset(S, 0, sizeof(S)); memset(T, 0, sizeof(T)); if(match(u)) ans++; } return ans; } // 求最小覆盖。X和Y为最小覆盖中的点集 int mincover(vector<int>& X, vector<int>& Y) { int ans = solve(); memset(S, 0, sizeof(S)); memset(T, 0, sizeof(T)); for(int u = 0; u < n; u++) if(right[u] == -1) match(u); // 从所有X未盖点出发增广 for(int u = 0; u < n; u++) if(!S[u]) X.push_back(u); // X中的未标记点 for(int v = 0; v < m; v++) if(T[v]) Y.push_back(v); // Y中的已标记点 return ans; } }; BPM solver;
相关文章推荐
- poj 3020 二分图最小路径覆盖
- POJ 2226 二分图最小覆盖
- 【二分图|最小路径覆盖】POJ-1422 Air Raid
- [BZOJ 2150]部落战争(最小路径覆盖、二分图最大匹配)
- 二分图及二分图最小顶点覆盖 最大独立集
- (step6.3.3)hdu 1150(Machine Schedule——二分图的最小点覆盖数)
- hdu 1151 二分图最小路径覆盖
- DAG最小路径覆盖与二分图最大匹配
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- POJ 2226Muddy Fields(二分图最大匹配之最小点覆盖)
- 【最小路径覆盖】【二分图】【最大流】【Dinic】bzoj2150 部落战争
- HDU 2119 Matrix(二分图最小顶点覆盖)
- HDU 2119 Matrix【二分图之最小点集覆盖】
- POJ 3020Antenna Placement(二分图最小顶点覆盖)
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
- HDU 1528 (二分图最大匹配 + 最小覆盖, 14.07.17)
- poj 2226 Muddy Fields(二分图——最小点覆盖)
- poj2594(二分图,最小路径覆盖变形)
- [转载]二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- POJ-3041-Asteroids(二分图最小点覆盖)