POJ 3041 Asteroids (最小点覆盖)

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;
}


你可能感兴趣的:(poj)