#include <stdio.h> #include <math.h> #include <string.h> #define N 3002 int m,n; bool map[N][N]; int Mx[N]; int My[N]; int chk[N]; int pre[N]; int qu[N]; struct People { int x,y,s; }p[N]; struct Umbrella { int x,y; }u[N]; int BFS(int i) { int base=0,top=1; int u,v,e,d,t; bool flag=0; qu[0]=i; pre[i]=-1; while(top!=base && !flag) { u=qu[base]; for (v=0;v<n && !flag;v++) { if (map[u][v] && chk[v]!=i)//在第i次没有找过 { chk[v]=i; qu[top]=My[v]; top++; if (My[v]!=-1) pre[My[v]]=u; else//找到增广路 { flag=1; d=u; e=v; while(d!=-1) { t=Mx[d];//e等于原先匹配的另一端 Mx[d]=e; My[e]=d; e=t; d=pre[d]; } } } } base++; } return flag; } int max_match() { int i,sum=0; memset(Mx, -1, sizeof(Mx)); memset(My, -1, sizeof(My)); memset(chk, -1, sizeof(chk)); for (i=0;i<m;i++) { if (BFS(i)) sum++; } return sum; } double dis(struct People a,struct Umbrella b) { double d; d=1.*(a.x-b.x)*(a.x-b.x)+1.*(a.y-b.y)*(a.y-b.y); d=sqrt(d); return d; } int main() { //freopen("2389.txt","r",stdin); int i,j,T,k,time,sum; scanf("%d",&T); for (k=0;k<T;k++) { memset(map,0,sizeof(map)); scanf("%d%d",&time,&m);//m people for (i=0;i<m;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].s); scanf("%d",&n); for (i=0;i<n;i++) scanf("%d%d",&u[i].x,&u[i].y); for (i=0;i<m;i++) { for (j=0;j<n;j++) { map[i][j]=0; if (dis(p[i],u[j])<=time*p[i].s) map[i][j]=1; } } sum=max_match(); printf("Scenario #%d:/n",k+1); printf("%d/n/n",sum); } }