题意:给出若干老鼠坐标、若干洞坐标、老鼠奔跑速度和限制时间。已知一个洞最多躲一个老鼠,问在限制时间内最少有多少老鼠跑不回洞。
思路:建图的时候添加判断,如果一个老鼠能在限制时间内跑回洞则有边,剩下的hungary模板。
#include <stdio.h> #include <string.h> #include <math.h> #define N 102 struct point{ double x,y; }mice[N],hole[N]; struct { int y,next; }e[N*N]; int n,m,res; double time,v; int first[N],used[N],link[N],top; void init(){ top = res = 0; memset(first,-1,sizeof(first)); memset(link,-1,sizeof(link)); } void add(int x,int y){ e[top].y = y; e[top].next = first[x]; first[x] = top++; } int check(int a,int b){ double dis = sqrt((mice[a].x-hole[b].x)*(mice[a].x-hole[b].x)+(mice[a].y-hole[b].y)*(mice[a].y-hole[b].y)); return dis/v < time; } int dfs(int i){ int j,y; for(j = first[i];j!=-1;j=e[j].next){ y = e[j].y; if(!used[y]){ used[y] = 1; if(link[y] == -1||dfs(link[y])){ link[y] = i; return 1; } } } return 0; } int hungary(){ int i; for(i = 1;i<=n;i++){ memset(used,0,sizeof(used)); if(dfs(i)) res++; } return n-res; } int main(){ freopen("a.txt","r",stdin); while(scanf("%d %d",&n,&m)!=EOF){ int i,j,num; init(); scanf("%lf %lf",&time,&v); for(i = 1;i<=n;i++) scanf("%lf %lf",&mice[i].x,&mice[i].y); for(i = 1;i<=m;i++) scanf("%lf %lf",&hole[i].x,&hole[i].y); for(i = 1;i<=n;i++) for(j = 1;j<=m;j++) if(check(i,j)) add(i,j); printf("%d\n",hungary()); } return 0; }