您的位置:首页 > 其它

[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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: