题意:输入n,m,s,v 然后给出n个地鼠坐标和m个洞坐标,v是地鼠跑的速度,一个洞里只能待一只地鼠,问s秒后最多有多少只地鼠被攻击(没被抓到)。
二分图
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=105;
#define eps 1e-8
vector<int>vt[N];
struct point{
double x,y;
}point[N],d[N];
bool vis[N];
int pre[N];
double dis(int i,int j){
double tmp=(point[i].x-d[j].x)*(point[i].x-d[j].x)+(point[i].y-d[j].y)*(point[i].y-d[j].y);
return sqrt(tmp);
}
int find(int k){
int i;
for(i=0;i<vt[k].size();i++){
int j=vt[k][i];
if(vis[j])continue;
vis[j]=1;
if(pre[j]==-1 || find(pre[j])){
pre[j]=k;
return 1;
}
}
return 0;
}
int main(){
int i,j;
int n,m;
double s,v;
while(cin>>n>>m>>s>>v){
for(i=1;i<=n;i++){
scanf("%lf %lf",&point[i].x,&point[i].y);
}
for(i=1;i<=m;i++){
scanf("%lf %lf",&d[i].x,&d[i].y);
}
for(i=1;i<=n;i++)vt[i].clear();
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(s*v-dis(i,j)>eps)vt[i].push_back(j);
}
}
int ans=0;
memset(pre,-1,sizeof(pre));
for(i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(find(i))ans++;
}
printf("%d\n",n-ans);
}
return 0;
}