UPCOJ2985 Gopher(二分匹配)

这道题是我们弱校大一校赛的防AK题。。。

当时不到1个半小时做完其他题就一直在看他

然而当时并没有学二分匹配

然后就各种结构体sort。。。

整了3个多小时还是败了

于是学习了一下,这就很简单了

题意就是给你n个老鼠m个洞,并给你坐标和老鼠的速度和最晚时间

通过这些距离算出每个老鼠对于每个洞能否在规定时间内进去。。

然后就。。。好了

/* ***********************************************
Author        :devil
Created Time  :2016/4/8 23:53:26
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
double x1[110],x2[110],yy[110],y2[110];
bool vis[110];
int n,m,s,v,linker[110];
vector<int>eg[110];
int dfs(int u)
{
    for(int i=0;i<eg[u].size();i++)
    {
        int to=eg[u][i];
        if(!vis[to])
        {
            vis[to]=1;
            if(linker[to]==-1||dfs(linker[to]))
            {
                linker[to]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d%d",&n,&m,&s,&v))
    {
        for(int i=0; i<n; i++)
            eg[i].clear();
        memset(linker,-1,sizeof(linker));
        for(int i=0; i<n; i++)
            scanf("%lf%lf",&x1[i],&yy[i]);
        for(int i=0; i<m; i++)
            scanf("%lf%lf",&x2[i],&y2[i]);
        v=v*s*v*s;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                double p=(x1[i]-x2[j])*(x1[i]-x2[j])+(yy[i]-y2[j])*(yy[i]-y2[j]);
                if(p<=v) eg[i].push_back(j);
            }
        }
        int ans=0;
        for(int i=0; i<n; i++)
        {
            memset(vis,0,sizeof(vis));
            ans+=dfs(i);
        }
        printf("%d\n",n-ans);
    }
    return 0;
}

 

posted on 2016-04-08 23:52  恶devil魔  阅读(230)  评论(0编辑  收藏  举报

导航