最大匹配 PKU 2536

http://poj.org/problem?id=2536

问题描述及分析:

该题较简单,题意是给出m个动物的地点,n个洞,还有速度和时间(其实就是给了距离),问m个动物最多能有几个在规定的时间里一规定的速度躲到洞里逃生。典型的二分图匹配的问题,动物的位置为左边的结点,洞为右边的结点,如果他们的距离小于等于时间×速度,我们就认为他们是连接的,否则认为不连接,我们只要计算最大二分图匹配数,就是可以逃生的动物数,用总数减去匹配数就是不能逃生的,即为所求。

用匈牙利算法如下:

#include<iostream>
#include<math.h>

#define Max 101
using namespace std;

int map[Max][Max]; // 记地图录
int link[Max]; // link[y] 记录 与 y 节点相连的 x
int visit[Max];// 将对 y 节点进行扩充过的记录在 visit[y] 为1 
int gn,gm; // gn 表示 匹配的 x gm 表示匹配的 y 的个数

typedef struct Node{
	double x,y;
}Node;

Node gopher[Max],hole[Max];

bool can(int s){
	for( int i=1;i<=gm;i++){
		if( visit[i]==0 && map[s][i]){
			visit[i] =1;
			if( link[i]==0 || can(link[i])){
				link[i] = s;
				return true;
			}
		}
	}
	return false;
}

int maxMatch(){
	int i,num = 0;
	//memset(link,0,sizeof(link));
	for( i=1;i<=gn;i++){
		memset(visit,0,sizeof(visit));
		if( can(i)) num++; // 能找的一条增广路
	}
	return num;
}

double dis( Node x ,Node y){
	return sqrt( (x.x - y.x)*( x.x - y.x) + (x.y - y.y)*(x.y - y.y));
}

int main(void){
	int n=0,m=0, count=0;
	double t=0.0,v=0.0;
	int i=0,j=0,p,k=0;
	double temp =0.0;
	while(cin>>n>>m>>t>>v){
		count=0;
		memset(map,0,sizeof(map));
		memset(link,0,sizeof(link));
		memset(visit,0,sizeof(visit));
		temp = t*v;
		for( i=1;i<=n;i++){
			cin>>gopher[i].x>>gopher[i].y;
		}
		for(i=1;i<=m;i++){
			cin>>hole[i].x>>hole[i].y;
		}
		// 计算距离
		for(i=1; i<=n;i++){
			for( j=1;j<=m;j++){
				if( temp >= dis(gopher[i],hole[j])){
					map[i][j]=1;
				}
			}
		}
		gn = n; gm = m;
		cout<<n-maxMatch()<<endl;
	}
}

WA 了好久……题意没看清楚,,这个,我这菜鸟加油啊!


你可能感兴趣的:(算法,struct)