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;

}

  

你可能感兴趣的:(poj)