您的位置:首页 > 大数据 > 人工智能

hdu_2389 Rain on your Parade 匈牙利算法的bfs实现

2013-09-20 01:46 435 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 3005
int limit,n,m;
struct node{
int x,y,speed;
}s1
,s2
;
int mx
,my
,mk
;
int pred
;
queue<int> p;

bool judge(int u,int v){
if(((s1[u].x-s2[v].x)*(s1[u].x-s2[v].x)+(s1[u].y-s2[v].y)*(s1[u].y-s2[v].y))<=(limit*limit*s1[u].speed*s1[u].speed)) return true;
return false;
}
int hungary(){
while(!p.empty()) p.pop();
memset(mx,-1,sizeof(mx));
memset(my,-1,sizeof(my));
memset(mk,-1,sizeof(mk));
int cnt=0;
for(int i=0;i<n;i++){
if(mx[i]!=-1) continue;
pred[i]=-1;
while(!p.empty()) p.pop();
p.push(i);
bool flag=0;
while(!p.empty()&&!flag){
int u=p.front();
p.pop();
for(int v=0;v<m&&!flag;v++){
if(mk[v]!=i&&judge(u,v)){
mk[v]=i;
p.push(my[v]);
if(my[v]>=0){
pred[my[v]]=u;
}
else{
flag=1;
int x=u,y=v;
while(x!=-1){
int temp=mx[x];
mx[x]=y;
my[y]=x;
x=pred[x];
y=temp;
}
}
}
}
}
if(mx[i]!=-1) cnt++;
}
return cnt;
}
int main(){
int t,f=1;
scanf("%d",&t);
while(t--){
scanf("%d%d",&limit,&n);
for(int i=0;i<n;i++){
scanf("%d%d%d",&s1[i].x,&s1[i].y,&s1[i].speed);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&s2[i].x,&s2[i].y);
}
printf("Scenario #%d:\n%d\n\n",f++,hungary());
}
return 0;
}

刚开始是dfs写匈牙利算法果断的超时。。。。。。

就学习了下bfs写法,又果断的过了。。。。还有HK算法同样可以解决这题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: