建二分图,然后去跑匈牙利算法就好了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,t,bf[N],ans=0,h[N],num=0;
bool f[N];
struct point{
double x,y;
}p[N];
struct edge{
int to,next;
}data[N*N];
bool find(int x){
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;if(f[y]) continue;
f[y]=1;if(!bf[y]||find(bf[y])){bf[y]=x;return 1;}
}
}
int main(){
// freopen("a.in","r",stdin);
while(~scanf("%d%d%d",&n,&m,&t)){
num=0;memset(h,0,sizeof(h));
for(int i=1;i<=m;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=1;i<=n;++i){
double x,y,v;scanf("%lf%lf%lf",&x,&y,&v);
for(int j=1;j<=m;++j){
if((x-p[j].x)*(x-p[j].x)+(y-p[j].y)*(y-p[j].y)>v*t*v*t) continue;
data[++num].to=j;data[num].next=h[i];h[i]=num;
}
}
for(int i=1;i<=n;++i){
memset(f,0,sizeof(f));
if(find(i)) ans++;
}
printf("%d\n",ans);
}
return 0;
}