0
点赞
收藏
分享

微信扫一扫

Gopher II

星河出山 2022-01-20 阅读 109

Gopher II(二分图匹配-匈牙利算法)

题意:
n个老鼠,m个洞,每个老鼠到洞的速度为v,老鼠到洞的时间不能超过S,要不然会被吃掉,求最少被吃了几个老鼠
思路:
求这个二分图的最大匹配。到洞不超过s的老鼠和洞之间有边

int n,m,c[1000][1000],pre[maxn];
bool vis[maxn];
double s,v;
struct node
{
    double x,y;
}G[200],H[200];
double dis(node p,node q)
{
    return  sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));
}
int dfs(int x)
{
    for(int i=1;i<=m;i++){
        if(!vis[i]&&c[x][i]){//扫描每个dong
        //如果有bian并且还没有标记过(这里标记的意思是这次查找曾试图改变过该dong的归属问题,但是没有成功,所以就不用瞎费工夫了)
            vis[i]=1;
            if(pre[i]==-1||dfs(pre[i])){
				//名花无主或者能腾出个位置来,这里使用递归
                pre[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    
    int i,j,a,b,t;
    while(~scanf("%d%d%lf%lf",&n,&m,&s,&v)){
        memset(pre,-1,sizeof(pre));
        memset(c,0,sizeof(c));
        for(i=1;i<=n;i++){
            scanf("%lf%lf",&G[i].x,&G[i].y);
        }
        for(i=1;i<=m;i++){
            scanf("%lf%lf",&H[i].x,&H[i].y);
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                double d=dis(G[i],H[j]);
                d/=v;
                if(d<=s){
                   c[i][j]=1;
                }
            }
        }
        int ans=0;
        for(i=1;i<=n;i++){//匈牙利算法
            memset(vis,0,sizeof(vis));
            ans+=dfs(i);
        }
        printf("%d\n",n-ans);
    }
    return 0;
}
举报

相关推荐

0 条评论