POJ_2536_Gopher II

题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉。

分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使用匈牙利。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define Del(x,y) memset(x,y,sizeof(x))

double xx[105],yy[105];
int n,m;
int map[105][105],vis[105],link[105];

bool dfs(int x)
{
    for(int i=1; i<=m; i++)
        if(map[x][i]==1&&vis[i]==0)
        {
            vis[i]=1;
            if(link[i]==-1||dfs(link[i]))
            {
                link[i]=x;
                return true;
            }
        }
    return false;
}

void solve()
{
    int ans=0;
    Del(link,-1);
    for(int i=1; i<=n; i++)
    {
        Del(vis,0);
        if(dfs(i))
            ans++;
    }
    printf("%d\n",n-ans);
}

double dis(int i,double a,double b)
{
    return sqrt((xx[i]-a)*(xx[i]-a)+(yy[i]-b)*(yy[i]-b));
}

int main()
{
    int s,v;
    double p,q;
    while(~scanf("%d%d%d%d",&n,&m,&s,&v))
    {
        for(int i=1; i<=n; i++)
            scanf("%lf%lf",&xx[i],&yy[i]);
        Del(map,0);
        for(int i=1; i<=m; i++)
        {
            scanf("%lf%lf",&p,&q);
            for(int j=1; j<=n; j++)
            {
                if(dis(j,p,q)<=(s*v))
                    map[j][i]=1;
            }
        }
        solve();
    }
    return 0;
}

 

posted on 2015-08-24 22:54  JASONlee3  阅读(228)  评论(0编辑  收藏  举报

导航