给你地鼠的坐标和洞的坐标,每个洞只能进一只地鼠,地鼠的奔跑速度,以及如果地鼠暴露在外面大于等于s秒,就有危险。
求出最小的有危险的地鼠的个数。
呃。。。开始没读清。。。求了最多的没危险的地鼠的个数。。。
建图很简单,找到地鼠和洞的长度,判断如果长度/速度 小于时间s,即建一条边。
然后求最大匹配数,最后用n减下就好。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 220 using namespace std; typedef struct COOR{ double x,y; }COOR; COOR g[MAX/2],h[MAX/2]; int map[MAX][MAX]; int used[MAX]; int match[MAX]; double Distance(int i,int k) { double x = g[i].x - h[k].x; double y = g[i].y - h[k].y; return sqrt( x*x + y*y ); } int Augement(int n,int x) // n是图节点数的上界 { int i; for(i=1; i<=n; i++) // 寻找增广路 if( !used[i] && map[x][i] ) { used[i] = 1; if( match[i] == 0 || Augement(n,match[i]) ) // 如果被标记了,就找被标记点是否可以增广 { match[i] = x; return 1; } } return 0; } int Hungary(int n) { int i,sum = 0; memset(match,0,sizeof(match)); for(i=1; i<=n; i++) // 对每个点进行增广 { memset(used,0,sizeof(used)); if( Augement(n,i) ) sum++; } return sum; } int main() { int n,m,s,v,i,k,ans; double len; while( ~scanf("%d%d%d%d",&n,&m,&s,&v) ) { memset(map,0,sizeof(map)); for(i=1; i<=n; i++) scanf("%lf%lf",&g[i].x,&g[i].y); for(i=1; i<=m; i++) scanf("%lf%lf",&h[i].x,&h[i].y); for(i=1; i<=n; i++) for(k=1; k<=m; k++) { len = Distance(i,k); if( len / (v*1.0) < s*1.0 ) map[i][k+n] = 1; } ans = Hungary(m+n); printf("%d/n",n-ans); } return 0; }