您的位置:首页 > 其它

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的

一条边,构建出图后,就变成了找最少的点,使得这些点与所有的边相邻,即最小点覆盖问题。

又继续敲了一遍匈牙利算法…

/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: