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

来源:互联网 发布:店铺数据分析怎么写 编辑:程序博客网 时间:2024/05/16 05:28
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;#define N 3005int limit,n,m;struct node{int x,y,speed;}s1[N],s2[N];int mx[N],my[N],mk[N];int pred[N];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算法同样可以解决这题。

原创粉丝点击