POJ_2536_Gopher II
题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉。
分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使用匈牙利。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define Del(x,y) memset(x,y,sizeof(x)) double xx[105],yy[105]; int n,m; int map[105][105],vis[105],link[105]; bool dfs(int x) { for(int i=1; i<=m; i++) if(map[x][i]==1&&vis[i]==0) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return true; } } return false; } void solve() { int ans=0; Del(link,-1); for(int i=1; i<=n; i++) { Del(vis,0); if(dfs(i)) ans++; } printf("%d\n",n-ans); } double dis(int i,double a,double b) { return sqrt((xx[i]-a)*(xx[i]-a)+(yy[i]-b)*(yy[i]-b)); } int main() { int s,v; double p,q; while(~scanf("%d%d%d%d",&n,&m,&s,&v)) { for(int i=1; i<=n; i++) scanf("%lf%lf",&xx[i],&yy[i]); Del(map,0); for(int i=1; i<=m; i++) { scanf("%lf%lf",&p,&q); for(int j=1; j<=n; j++) { if(dis(j,p,q)<=(s*v)) map[j][i]=1; } } solve(); } return 0; }