[POJ3041] Asteroids(最小点覆盖-匈牙利算法)
2017-05-06 15:58
393 查看
题意:
给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次。解析:
把每一行与每一列当做二分图两边的点。
某格子有障碍,则对应行与列连边。
选出最少的点,使得所有边被覆盖。
最小点覆盖。
——代码
#include <cstdio> #include <cstring> #define M(x, a) memset(a, x, sizeof(a)) using namespace std; const int MAXN = 501; int n, k, cnt, ans; int head[MAXN], next[MAXN * MAXN], to[MAXN * MAXN], belong[MAXN]; bool vis[MAXN]; inline void add(int x, int y) { to[cnt] = y; next[cnt] = head[x]; head[x] = cnt++; } inline bool find(int u) { int i, v; for(i = head[u]; i != -1; i = next[i]) { v = to[i]; if(!vis[v]) { vis[v] = 1; if(!belong[v] || find(belong[v])) { belong[v] = u; return 1; } } } return 0; } int main() { int i, x, y; scanf("%d %d", &n, &k); M(-1, head); for(i = 1; i <= k; i++) { scanf("%d %d", &x, &y); add(x, y); } for(i = 1; i <= n; i++) { M(0, vis); if(find(i)) ans++; } printf("%d", ans); return 0; }View Code
相关文章推荐
- POJ3041《Asteroids》方法:匈牙利算法(最小点覆盖数==最大二分匹配数)
- pku 3041 Asteroids 二分图匹配——匈牙利算法求最小点覆盖
- POJ 3041 Asteroids(匈牙利算法—最小点覆盖)
- poj3041 最小点覆盖即最大匹配(匈牙利算法)(模板)
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- POJ 3041 Asteroids (匈牙利算法最小点覆盖)
- POJ 3041 Asteroids 匈牙利算法/最小点覆盖
- POJ 3041 Asteroids 【匈牙利算法最小点覆盖】
- 【POJ 3041 】Asteroids (匈牙利算法最小点覆盖&二分图)
- POJ 3041 Asteroids 【匈牙利算法最小点覆盖】
- POJ 3041 Asteroids(最小顶点覆盖,匈牙利算法模板)
- POJ3041 二分图最小点覆盖(匈牙利算法)
- POJ-1947-Asteroids-求最小点覆盖数(二分图-匈牙利算法)
- poj_3041 Asteroids(匈牙利算法+最小点覆盖)
- POJ 3041 Asteroids 匈牙利算法 最小点覆盖
- POJ3041 最小点覆盖 最大匹配数 回顾匈牙利算法
- [POJ2594] Treasure Exploration(最小路径覆盖-传递闭包 + 匈牙利算法)
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)
- HDU 4160 Dolls(二分图匹配+匈牙利算法+最小路径覆盖)
- E - Strategic Game (HDU - 1054 )(最小顶点覆盖)(匈牙利算法模板)(树形DP)