HDU 2482 Transit search

来源:互联网 发布:python 微信菜单 编辑:程序博客网 时间:2024/06/05 02:18

http://acm.hdu.edu.cn/showproblem.php?pid=2482


#include<iostream>#include<cmath>#include<vector>#include<string>#include<queue>using namespace std;#define N 5050#define NN 105#define M 10001#define inf 0x7fffffffint place[8]={5120,2560,1280,640,320,160,80,40};int fx,fy;int ex,ey;int m,n;struct bus_stop{int x,y;char ch[30];}B[N];vector<bus_stop> bus_line[NN];struct node{int next,v,w;node(){};node(int a,int b,int c){next=a;v=b;w=c;}}E[M];int head[NN],dis[NN],NE;bool h[NN];void init(){NE=0;memset(head,-1,sizeof(head));}void insert(int u,int v,int w){E[NE]=node(head[u],v,w);head[u]=NE++;}bool update(int u,int v,int w){if(dis[u]+w<dis[v]){dis[v]=dis[u]+w;return true;}return false;}void spfa(int beg,int end){queue<int> q;memset(h,0,sizeof(h));for(int i=0;i<=m+1;i++)dis[i]=inf;dis[beg]=0;q.push(beg);while(!q.empty()){int u=q.front();q.pop();h[u]=0;for(int i=head[u];i!=-1;i=E[i].next){int v=E[i].v;if(update(u,v,E[i].w)&&!h[v]){h[v]=1;q.push(v);}}}if(dis[end]==inf){printf("take a taxi\n");return;}printf("%d\n",dis[end]);}int find(char *p){for(int i=0;i<n;i++)if(strcmp(p,B[i].ch)==0)return i;}bool find_bus(vector<bus_stop> p,vector<bus_stop> q){for(int i=0;i<p.size();i++)for(int j=0;j<q.size();j++)if(strcmp(p[i].ch,q[j].ch)==0)return true;return false;}void trans(char *p,int &x,int &y){x*=4;y*=4;for(int i=0;i<8;i++){if(p[i]=='1')y+=place[i];else if(p[i]=='2')x+=place[i];else if(p[i]=='3'){x+=place[i];y+=place[i];}}}double cal_dis(int fx,int fy,int ex,int ey){double temp1=(fx*1.0-ex*1.0)*(fx*1.0-ex*1.0);double temp2=(fy*1.0-ey*1.0)*(fy*1.0-ey*1.0);return sqrt(temp1+temp2);}int main(void){int t;scanf("%d",&t);while(t--){char s[10],e[10];scanf("%s%d%d",s,&fx,&fy);scanf("%s%d%d",e,&ex,&ey);trans(s,fx,fy);trans(e,ex,ey);scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",B[i].ch);scanf("%d%d",&B[i].x,&B[i].y);}scanf("%d",&m);for(int i=1;i<=m;i++){char ch[30];int k;scanf("%d",&k);bus_line[i].clear();while(k--){scanf("%s",ch);int id=find(ch);bus_line[i].push_back(B[id]);}}if(cal_dis(fx,fy,ex,ey)<=2000.0){printf("walk there\n");continue;}int beg=0;int end=m+1;bool flag1,flag2;flag1=flag2=0;init();for(int i=1;i<=m;i++)for(int j=0;j<bus_line[i].size();j++){double k1=cal_dis(fx,fy,bus_line[i][j].x,bus_line[i][j].y);double k2=cal_dis(ex,ey,bus_line[i][j].x,bus_line[i][j].y);if(k1<=1000.0){flag1=true;insert(beg,i,1);}if(k2<=1000.0){flag2=true;insert(i,end,0);}}if(!flag1||!flag2){printf("take a taxi\n");continue;}for(int i=1;i<=m;i++)for(int j=i+1;j<=m;j++)if(find_bus(bus_line[i],bus_line[j])){insert(i,j,1);insert(j,i,1);}spfa(beg,end);}}


原创粉丝点击