HDU

来源:互联网 发布:生命之花 伤感网络歌曲 编辑:程序博客网 时间:2024/06/01 07:53
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市�善终蛱找Υ迓蛄烁龇孔樱�开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
Sample Input
6xiasha westlakexiasha station 60xiasha ShoppingCenterofHangZhou 30station westlake 20ShoppingCenterofHangZhou supermarket 10xiasha supermarket 50supermarket westlake 10-1
Sample Output
50Hint:The best route is:

xiasha->ShoppingCenterofHangZhou->supermarket->westlake

思路:重点是站点名字转化成数字,然后最短路

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>using namespace std;#define inf 99999999map<string,int>m;int Map[155][155];int book[155],vis[155];int n,st,en;int init(){    int i,j;    for(i=0;i<155;i++){        for(j=0;j<155;j++){            Map[i][j]=inf;        }         book[i]=inf;    }}void spfa(){  //  memset(vis,0,sizeof(vis));    queue<int>q;    while(!q.empty()) q.pop();    book[st]=0;//是起点到这个点的步数    q.push(st);    vis[st]=1;    while(!q.empty()){        st=q.front();        q.pop();       // vis[st]=0;        for(int i=1;i<=n;i++){            if( book[i]>(Map[st][i]+book[st])){//更新起点到这个点的最短路                book[i]=Map[st][i]+book[st];                //if(!vis[i]){//主要是如果队列的点不能再入了,数据小的话没影响                    q.push(i);                 //   vis[i]=1;               // }            }        }    }}int main() {    int t,i,j;    char s1[35],s2[35];    int a,b,c;    while(scanf("%d",&t) && t!=-1) {        n=0;        init();        m.clear();        scanf("%s%s",s1,s2);        m[s1]=++n;//把站名转化成数字        st=n;        if(!m[s2]) {//判断这个站是否已经被映射            m[s2]=++n;        }        en=m[s2];       // printf("st=%d en=%d\n",st,en);        while(t--){           // printf("t=%d\n",t);            scanf("%s%s%d",s1,s2,&c);           // printf("%s %s %d\n",s1,s2,c);            if(!m[s1]){                m[s1]=++n;            }            a=m[s1];           // printf("a=%d\n",a);            if(!m[s2]){                m[s2]=++n;            }             b=m[s2];            if(Map[a][b]>c){                Map[a][b]=c;                Map[b][a]=c;//双向路            }                          //  printf("Map[%d][%d]=%d\n",a,b,c);        }        if(st==en){             printf("0\n");            continue;        }        spfa();        if(book[en]==inf) printf("-1\n");//如果这个店没被走过        else        printf("%d\n",book[en]);    }    return 0;}


0 0
原创粉丝点击