题意
给出每个地鼠和洞的坐标和地鼠可以用的时间和速度,求最少有多少只地鼠在这些时间里跑不进洞里。
思路
我们先计算地鼠和洞之间的距离,然后判断地鼠是否可以跑到洞,我们就在它们之间建立一条边,之后就是最大匹配的问题了。
代码
#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);
}
}