SSL_1333 地鼠的困境

题意

给出每个地鼠和洞的坐标和地鼠可以用的时间和速度,求最少有多少只地鼠在这些时间里跑不进洞里。

思路

我们先计算地鼠和洞之间的距离,然后判断地鼠是否可以跑到洞,我们就在它们之间建立一条边,之后就是最大匹配的问题了。

代码

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
struct node{
    int next,to;
}f[10001];
int tot,t,n,m,s,v,head[101],ans,vis[101],link[101];
double x1[101],yi[101],x2[101],y2[101];
void add(int x,int y)
{
    f[++tot].next=head[x];
    f[tot].to=y;
    head[x]=tot;
}
int find(int x)
{
    for (int i=head[x];i;i=f[i].next)
    {
        int j=f[i].to;
        if (!vis[j])
        {
            int q=link[j];
            link[j]=x;
            vis[j]=1;
            if (!q||find(q)) return 1;
            link[j]=q;
        }
    }
    return 0;
}
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        memset(link,0,sizeof(link));
        memset(head,0,sizeof(head));
        tot=0;
        scanf("%d%d%d%d",&n,&m,&s,&v);
        for (int i=1;i<=n;i++)
        scanf("%lf%lf",&x1[i],&yi[i]);
        for (int i=1;i<=m;i++)
        scanf("%lf%lf",&x2[i],&y2[i]);
        for (int i=1;i<=n;i++)
          for (int j=1;j<=m;j++)
            {
                double x=sqrt(pow(x1[i]-x2[j],2)+pow(yi[i]-y2[j],2));//求出距离
                if (x<=s*v) add(i,j);//如果满足条件就在它们之间建立一条边
            }
        ans=0;
        for (int i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            if (!find(i)) ans++;//因为求的是进不去的,所以是!find(i)
        }
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/ssl_hzb/article/details/79897990