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; } }