POJ 3041 Asteroids

这个题的大意是:

有个人用一种威力巨大的武器可以打爆小行星,给定一个区域内所有的小行星坐标,问最少能用多少次这种武器打爆所有的小行星。

这是一个二分图匹配的模版题,以每一个小行星的X,Y坐标做二分图,然后上模版。

下面是代码:

#include <stdio.h>
#include <string.h>
const int M=500;
int n,k,map1[M][M],vis[M],link[M],m;
bool dfs(int x)
{
    for(int y=1; y<=n; y++)
    {
        if(map1[x][y] && !vis[y])
        {
            vis[y]=true;
            if(link[y]==0 || dfs(link[y])) //link[y]==0 :
            {

                link[y]=x;
                return true;
            }
        }
    }
    return false;
}
void hungray()
{
    int i;
    for(i=1; i<=n; i++)
    {
        memset(vis,false,sizeof(vis));
        if(dfs(i))
        {
            m++;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&k);
    memset(map1,0,sizeof(map1));
    memset(link,0,sizeof(link));
    int x,y,i;
    for(i=0; i<k; i++)
    {
        scanf("%d%d",&x,&y);
        map1[x][y]=1;
    }
    m=0;
    hungray();
    printf("%d\n",m);
    return 0;
}


posted @ 2013-08-10 14:28  、小呆  阅读(105)  评论(0编辑  收藏  举报