POJ - 3041 最小顶点覆盖
2017-01-24 16:39
309 查看
题意:
在n*n的网格中,有k颗小行星。小行星i的位置是(Ri,Ci),现在可以一次摧毁一行或者一列的小行星,问要使得所有小行星毁灭,最少需要多少次。思路:
最小顶点覆盖,左边是n个点,代表n行,右边是n个点,代表n列,行星当作边,如果(x,y)上有行星,就将左边节点x和右边节点y连边。那么题目所求也就是要求最小顶点覆盖,来消灭所有的行星(边)。代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int MAXN = 505; const int MAXM = 505; struct node { int x, y, z; bool operator < (const node &b) const { if (x == b.x) { if (y == b.y) return z < b.z; return y < b.y; } return x < b.x; } }a[MAXN]; struct BgMaxMatch { int nl, nr; int l[MAXN], r[MAXM]; bool vis[MAXN]; vector <int> G[MAXN]; //这里注意要看是按左右哪边建图,也有可能是MAXM void init(int nl, int nr) { this -> nl = nl; this -> nr = nr; for (int i = 1; i <= nl; i++) G[i].clear(); memset(vis, false, sizeof(vis)); } void AddEdge(int u, int v) { G[u].push_back(v); } bool dfs(int u){ int cnt = G[u].size(); for (int i = 0; i < cnt; i++) { int v = G[u][i]; if (!vis[v]) { vis[v] = true; if(l[v] == -1 || dfs(l[v])) { l[v] = u; r[u] = i; return true; } } } return false; } int MaxMatch() { memset(l, -1, sizeof(l)); memset(r, -1, sizeof(r)); int ans = 0; for (int i = nl; i >= 1; i--) { memset(vis, false, sizeof(vis)); ans += dfs(i); } return ans; } } solver; int main() { int n, k; while (scanf("%d%d", &n, &k) != EOF) { solver.init(n, n); for (int i = 1; i <= k; i++) { int x, y; scanf("%d%d", &x, &y); solver.AddEdge(x, y); } printf("%d\n", solver.MaxMatch()); } return 0; }
相关文章推荐
- poj 3041 Asteroids 最小顶点覆盖 && 二分匹配
- poj-3041【二分图最小顶点覆盖】
- POJ 3041 Asteroids HDU 1150 Machine Schedule (最小顶点覆盖)
- POJ-3041 行列匹配构图+最小顶点覆盖
- POJ 3041 —— 最小顶点覆盖
- POJ 3041 Asteroids(最小顶点覆盖)
- poj-3041-Asteroids【二分匹配&&最小顶点覆盖】
- poj 3041 Asteroids(二分图最小顶点覆盖)
- poj 3041-Asteroids-最小顶点覆盖
- 【最小顶点覆盖数】POJ 3041 + POJ 2226+HDU 5093
- POJ 3041 Asteroids 最小顶点覆盖
- poj 3041 二分图最小顶点覆盖 小行星删行或列
- POJ 3041 Asteroids(最小顶点覆盖,匈牙利算法模板)
- poj 3041 Asteroids -二分匹配-最小顶点覆盖
- POJ 3041-Asteroids(二分图最小顶点覆盖)
- poj 3041 Asteroids (最大匹配最小顶点覆盖——匈牙利模板题)
- POJ 3041 Asteroids(最小顶点覆盖)
- poj 3041 Asteroids( 最小顶点覆盖,二分图)
- 【最小顶点覆盖】POJ 3041
- POJ 3041 Asteroids (最小顶点覆盖)