hdu2482
来源:互联网 发布:mac excel 日历控件 编辑:程序博客网 时间:2024/06/16 06:32
/*
分析:
我的方法是字典树+BFS。
单词比较多,就用字典树了,而边权是1,所以
直接用BFS喽,就不用写最短路了。
第一次MLE了,是因为怀疑name里面可能大小写
都有,字典树就开大了,但事实上是只有小写- -I,
于是1MLE后就ac了。当然,如果在每组测试前都先
进行一次空间释放也行,不过时间就浪费了。
身为一名菜菜,真没想到这个题我提交后竟然是
第5耶~,46MS
2012-07-26
*/
分析:
我的方法是字典树+BFS。
单词比较多,就用字典树了,而边权是1,所以
直接用BFS喽,就不用写最短路了。
第一次MLE了,是因为怀疑name里面可能大小写
都有,字典树就开大了,但事实上是只有小写- -I,
于是1MLE后就ac了。当然,如果在每组测试前都先
进行一次空间释放也行,不过时间就浪费了。
身为一名菜菜,真没想到这个题我提交后竟然是
第5耶~,46MS
2012-07-26
*/
#include"stdio.h"#include"string.h"#include"stdlib.h"struct node{int x,y;int step;int total;int mem[333];int flag; //-1代表距离起点在<=1000M,1代表距离终点<=1000M}E[5011];int x_s,y_s;int x_e,y_e;int queue[6066]; //这里我自己模拟的基础队列int K,Key; //队列前后指针struct dictree //字典树{struct dictree *child[26];int flag;};struct dictree *root;int key;void insert(char *S){struct dictree *cur,*New;int i,j;cur=root;for(i=0;S[i];i++){if(cur->child[S[i]-'a'])cur=cur->child[S[i]-'a'];else{New=(struct dictree *)malloc(sizeof(struct dictree));for(j=0;j<26;j++)New->child[j]=0;New->flag=-1;cur->child[S[i]-'a']=New;cur=New;}}cur->flag=key;}int find(char *S){struct dictree *cur;int i;cur=root;for(i=0;S[i];i++){if(cur->child[S[i]-'a'])cur=cur->child[S[i]-'a'];elsereturn -1;}return cur->flag;}int BFS(){int i;K=0;while(K<Key){if(E[queue[K]].flag==1)return E[queue[K]].step;for(i=0;i<E[queue[K]].total;i++){if(E[queue[K]].step+1<E[E[queue[K]].mem[i]].step){E[E[queue[K]].mem[i]].step=E[queue[K]].step+1;queue[Key++]=E[queue[K]].mem[i];}}K++;}return -1;}int main(){int T;int n,m,k;int f[33];char name_temp[33][25];int i,j;int ans;int a,b;char str[25];int base[9]={5120,2560,1280,640,320,160,80,40,20};scanf("%d",&T);while(T--){///起点终点scanf("%s%d%d",str,&a,&b);x_s=y_s=0;for(i=0;i<8;i++){if(str[i]=='1')y_s+=base[i];else if(str[i]=='2')x_s+=base[i];else if(str[i]=='3'){x_s+=base[i];y_s+=base[i];}}x_s+=a*8;y_s+=b*8;scanf("%s%d%d",str,&a,&b);x_e=y_e=0;for(i=0;i<8;i++){if(str[i]=='1')y_e+=base[i];else if(str[i]=='2')x_e+=base[i];else if(str[i]=='3'){x_e+=base[i];y_e+=base[i];}}x_e+=a*8;y_e+=b*8;///站点读入以及字典树insertroot=(struct dictree *)malloc(sizeof(struct dictree));for(j=0;j<26;j++)root->child[j]=0;root->flag=-1;Key=0;scanf("%d",&n);for(key=0;key<n;key++){scanf("%s%d%d",str,&E[key].x,&E[key].y);insert(str);E[key].step=11111111;E[key].total=0;if((E[key].x-x_s)*(E[key].x-x_s)+(E[key].y-y_s)*(E[key].y-y_s)<=1000000){E[key].step=0;E[key].flag=-1;queue[Key++]=key;}else if((E[key].x-x_e)*(E[key].x-x_e)+(E[key].y-y_e)*(E[key].y-y_e)<=1000000)E[key].flag=1;elseE[key].flag=0;}///路线读入以及关系构建scanf("%d",&m);while(m--){scanf("%d",&k);for(i=0;i<k;i++){scanf("%s",name_temp[i]);f[i]=find(name_temp[i]);}for(i=1;i<k;i++){for(j=0;j<i;j++){E[f[i]].mem[E[f[i]].total++]=f[j];E[f[j]].mem[E[f[j]].total++]=f[i];}}}///结果if((x_s-x_e)*(x_s-x_e)+(y_s-y_e)*(y_s-y_e)<=4000000){printf("walk there\n");continue;}ans=BFS();if(ans==-1)printf("take a taxi\n");elseprintf("%d\n",ans);}return 0;}
- hdu2482
- hdu2482 字典树+spfa
- HDU2482 - Transit search (Floyd)
- hdu2482 transit search
- Vim中关于 cscope 的帮助
- Flex开发中如何给SWF传递外部提供的参数
- [Java] java异常处理(1)
- C#.net发送邮件
- String,StringBuffer与StringBuilder的区别
- hdu2482
- Android 解决ListView 和 ScrollView 共存冲突的问题(另一种解决方案)
- offsetTop、clientTop、scrollTop、offsetTop属性介绍
- 一、SSL协议的概述
- C++的new和delete剖析
- android采用post方式获取服务器数据
- 使用自定义的UIView
- Malloc/new和delete/free的区别
- 关于Object与String