题意:一块田地上有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;
}