POJ 3041 Asteroids (最小点覆盖)
2012-04-04 13:59
453 查看
http://poj.org/problem?id=3041
给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,
最少要几次。这里将每行x看成一个X结点,每列Y看成一个Y结点,障碍的坐标x,y看成X到Y的
一条边,构建出图后,就变成了找最少的点,使得这些点与所有的边相邻,即最小点覆盖问题。
又继续敲了一遍匈牙利算法…
给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,
最少要几次。这里将每行x看成一个X结点,每列Y看成一个Y结点,障碍的坐标x,y看成X到Y的
一条边,构建出图后,就变成了找最少的点,使得这些点与所有的边相邻,即最小点覆盖问题。
又继续敲了一遍匈牙利算法…
/* Memory: 424K Time: 47MS Language: C++ Result: Accepted */ #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 505 bool map[MAXN][MAXN], vis[MAXN]; int match[MAXN]; int n, k; bool dfs( int u) { int v; for( v = 1; v <= n; v ++) if( map[u][v] && !vis[v]) { vis[v] = true; if( match[v] == -1 || dfs( match[v])) { match[v] = u; return true; } } return false; } int MaxMatch() { int u, ret = 0; memset( match, -1, sizeof match); for( u = 1; u <= n; u ++) { memset( vis, false, sizeof vis); if( dfs(u)) ret ++; } return ret; } int main() { while( scanf( "%d%d", &n, &k) == 2) { int x, y; memset( map, false, sizeof map); for( int i = 1; i <= k; i ++) { scanf( "%d%d", &x, &y); map[x][y] = true; } int ans = MaxMatch(); printf( "%d\n", ans); } return 0; }
相关文章推荐
- poj 3041 Asteroids(二分匹配,最小点覆盖)
- Poj 3041 Asteroids【最小点覆盖】
- POJ 3041 Asteroids 最小覆盖数
- POJ 3041 Asteroids(最小顶点覆盖,匈牙利算法模板)
- poj_3041 Asteroids(匈牙利算法+最小点覆盖)
- POJ 3041 Asteroids (匈牙利算法最小点覆盖)
- POJ 3041 Asteroids 最小覆盖数
- POJ 3041 Asteroids 最小顶点覆盖
- POJ 3041 Asteroids 最小点覆盖
- POJ - 3041 Asteroids 二分图 最小点覆盖
- poj 3041-Asteroids-最小顶点覆盖
- 【POJ】3041 - Asteroids(最小点覆盖,好题)
- poj-3041-Asteroids【二分匹配&&最小顶点覆盖】
- POJ 3041 Asteroids 【匈牙利算法最小点覆盖】
- POJ - 3041 Asteroids (二部图最大匹配 = 最小点覆盖)
- POJ 3041 Asteroids(最小顶点覆盖)
- poj 题目3041 Asteroids (最小点覆盖)
- POJ 3041:Asteroids:最小点覆盖
- [POJ 3041][USACO 2005] Asteroids Hungary算法求最小点覆盖
- POJ 3041 Asteroids 【匈牙利算法最小点覆盖】