hdoj 2112 HDU Today

来源:互联网 发布:我的世界更多动物js 编辑:程序博客网 时间:2024/06/05 17:34

HDU Today

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19710    Accepted Submission(s): 4640


Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,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虽然偶尔会迷路,但是因为有了你的帮助**和**从此还是过上了幸福的生活。――全剧终――
 
处理字符串。
 
代码1:dijkstra
 
 
#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x3f3f3fusing namespace std;int map[160][160],low[160],vis[160];int n,k;char s[160][35];void init(){for(int i=0;i<=150;i++) //最大值不是n,是k,但现在k还未到最大值; {for(int j=0;j<=150;j++){if(i==j)map[i][j]=0;elsemap[i][j]=INF;}}}void dijkstra(int x){int next,j,i,min;memset(vis,0,sizeof(vis));for(i=0;i<=k;i++){low[i]=map[x][i];}vis[x]=1;for(i=1;i<=k;i++){min=INF;for(j=0;j<=k;j++){if(!vis[j]&&min>low[j]){min=low[j];next=j;}}if(min==INF)break;vis[next]=1;for(j=0;j<=k;j++){if(!vis[j]&&low[j]>low[next]+map[next][j]){low[j]=low[next]+map[next][j];}}}}int main(){int i,j,c,a,b;char start[35],end[35];while(scanf("%d",&n)!=EOF&&(n!=-1)){init();scanf("%s%s",s[0],s[1]); //将所在地与目的的放入数组中,0代替所在地,1代替目的地; k=1;for(i=0;i<n;i++)    {    scanf("%s%s%d",start,end,&c);    for(j=0,a=-1,b=-1;j<=k;j++) //将车站都放入数组中;     {        if(strcmp(s[j],start)==0&&a==-1)    a=j;if(strcmp(s[j],end)==0&&b==-1)b=j;if(a!=-1&&b!=-1)break;}if(a==-1){k++;a=k;strcpy(s[a],start);}if(b==-1){k++;b=k;strcpy(s[b],end);}if(map[a][b]>c)map[a][b]=map[b][a]=c;}if(strcmp(s[0],s[1])==0) //所在地与目的地相同时输出0; {printf("0\n");continue;}dijkstra(0);if(low[1]==INF)printf("-1\n");elseprintf("%d\n",low[1]);}return 0;}
 
代码2:spfa
 
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define INF 0x3f3f3f#define MAXM 20000+10#define MAXN 150+10using namespace std;struct record{    int to,next,val;}edge[MAXM];int n,low[MAXN],vis[MAXN],head[MAXN],k,top;char s[160][35];void init(){    top=0;    for(int i=0;i<=150;i++)    {        head[i]=-1;        vis[i]=0;    }}void add(int a,int b,int c){    edge[top].to=b;    edge[top].val=c;    edge[top].next=head[a];    head[a]=top++;}void spfa(int x){    int i,j;    queue<int>q;    for(i=0;i<=k;i++)    {        low[i]=INF;    }    vis[x]=1;    low[x]=0;    q.push(x);    while(!q.empty())    {        int u=q.front();        q.pop();        vis[u]=0;        for(i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(low[v]>low[u]+edge[i].val)            {                low[v]=low[u]+edge[i].val;                if(!vis[v])                {                    vis[v]=1;                    q.push(v);                }            }        }    }}int main(){    int i,j,d,a,b;    char start[35],end[35];    while(scanf("%d",&n)!=EOF&&(n!=-1))    {        init();        scanf("%s%s",s[0],s[1]);        k=1;        for(i=0;i<n;i++)        {            scanf("%s%s%d",start,end,&d);            for(j=0,a=-1,b=-1;j<=k;j++)            {                if(strcmp(start,s[j])==0&&a==-1)                {                    a=j;                }                if(strcmp(end,s[j])==0&&b==-1)                {                    b=j;                }                if(a!=-1&&b!=-1)                break;            }            if(a==-1)            {                k++;                a=k;                strcpy(s[a],start);            }            if(b==-1)            {                k++;                b=k;                strcpy(s[b],end);            }            add(a,b,d);            add(b,a,d);        }        if(strcmp(s[0],s[1])==0)        {            printf("0\n");            continue;        }        spfa(0);        if(low[1]==INF)        printf("-1\n");        else        printf("%d\n",low[1]);    }    return 0;}


1 0
原创粉丝点击