poj 2536 -- Gopher II (匈牙利)

本文探讨了一种基于地鼠与洞穴距离、速度限制条件下的生存策略问题。通过构建二分图并应用匈牙利算法,实现了对地鼠避险效率的最大化计算。文中详细阐述了如何通过计算距离与速度的乘积来确定地鼠是否能在危险出现前进入洞穴,从而避免危险。

题意:一块田地上有n只地鼠和m个地鼠洞,并且知道地鼠的奔跑速度v。如果地鼠的天敌出现,地鼠不能在t时间内跑入一个洞内,就会有危险。每个洞只能住一只地鼠,给出每个洞的坐标和每只地鼠的坐标,问你天敌出现的时候,最少有几只地鼠会有危险。

思路:基础二分图最大匹配,匈牙利算法实现,而我们建立的联系就是,如果这个地鼠和洞的距离小于地鼠的速度乘题里给的时间,那这个地鼠就和这个洞建立联系。

代码实现:

#include<stdio.h>
#include<string.h>
int ans,top,visit[110],by[110];
struct coor{
    double x,y;
}g[110],gh[110];
struct Edge{
    int v;
    Edge *next;
}*head[110],e[10000];
void Addedge(int from,int to){
    Edge *p=&e[top++];
    p->v=to;
    p->next=head[from];
    head[from]=p;
}
int dfs(int k){
    for(Edge *p=head[k];p;p=p->next){
        if(!visit[p->v]){
            visit[p->v]=1;
            if(by[p->v]==-1||dfs(by[p->v])){
                by[p->v]=k;
                return 1;
            }
        }
    }
    return 0;
}
void Hungry(int n){
    memset(by,-1,sizeof(by));
    for(int i=1;i<=n;i++){
        memset(visit,0,sizeof(visit));
        if(dfs(i)){
            ans++;
        }
    }
}
int main(){
    int n,m,s,v;
    while(~scanf("%d%d%d%d",&n,&m,&s,&v)){
        top=0,ans=0;
        double d=s*v*s*v;
        memset(head,0,sizeof(head));
        //memset(g,0,sizeof(g));
        //memset(gh,0,sizeof(gh));
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&g[i].x,&g[i].y);
        for(int i=1;i<=m;i++)
            scanf("%lf%lf",&gh[i].x,&gh[i].y);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if((g[i].x-gh[j].x)*(g[i].x-gh[j].x)+(g[i].y-gh[j].y)*(g[i].y-gh[j].y)<=d)
                    Addedge(i,j);
            }
        }
        Hungry(n);
        printf("%d\n",n-ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值