poj 2536 二分匹配
简单二分匹配,注意,输出的是n-最大匹配数
#include<stdio.h> #include<string.h> #include<math.h> int match[110]; bool map[110][110]; struct point{ double x,y; }p[110],hole[110]; double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } bool vis[110]; int m; bool dfs(int u){ int i; for(i=0;i<m;i++){ if(map[u][i]&&!vis[i]){ vis[i]=true; if(match[i]==-1||dfs(match[i])) { match[i]=u; return true; } } } return false; } int main() { int n,s,v; int i,j,k; while(scanf("%d%d%d%d",&n,&m,&s,&v)!=EOF){ memset(map,false,sizeof(map)); memset(match,-1,sizeof(match)); for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(i=0;i<m;i++) scanf("%lf%lf",&hole[i].x,&hole[i].y); for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(dis(p[i],hole[j])/v<=1.0*s) { map[i][j]=true; } } } int ans=0; for(i=0;i<n;i++){ memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n",n-ans); } return 0; }