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 了好久……题意没看清楚,,这个,我这菜鸟加油啊!