HDU 2112-HDU Today

来源:互联网 发布:python 周期性任务 编辑:程序博客网 时间:2024/05/21 22:23

HDU Today

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


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
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
 


Sample Output
50




Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake

虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。


――全剧终――


分析:
这题真是让我脑袋昏沉,首先,我很快写出了它,却花费几个小时来找 bug ,我这个人一不开心就喜欢暴饮暴食,不管饿不饿,然后眼看天色暗下来,丝毫没有食欲的我选择离开电脑去吃点东西缓解一下焦急的心情,然后回来,听完一个多小时的分享,再重新看本题的代码,很快就找到了。
首先先说两点注意的小地方:
第一个就是写代码尽量不要出现带颜色的关键字,比如这题中的 ans ,我本来准备用 count ,但是不行,给我报一堆我看不懂的东西,改了就好了。
第二个就是字符串问题,我们都知道到 string 类型的字符串比较的时候可以直接用 ==,但是 char 类型定义的字符串不行,(本题就是 wa 在这,耗了我几个小时),字符串比较的话就用 strcmp 函数。
总结来说,就是在前进的路上总是被小水沟溅一身泥,前两天做搜索的时候,忘了一个 getchar ,浪费了我半天时间,哎。。。。下次的更细心咯,希望看到的小伙伴们不要经常犯我这样的错误,做题千万要仔细哦。

本题不同于别的 dijkstra 的一点就是出入的点不是整数类型,而是字符串类型,我们只要用一个 map 来映射一下就好,因为刚开始我的代码还有超时的错误,所以写的过程中我也多添了两个 if ,一个是判断两地是否相等,再一个就是在 dijkstra 中找最短路径缩短其他点的距离的时候,如果找到INF 直接就跳出 。哎,我好伤心。。。。



#include <iostream>#include<stdio.h>#include<string>#include<string.h>#include<map>using namespace std;#define INF 0x3f3f3f3fint map1[155][155];int ans;void Dijkstra(){    int vis[155],bj,dis[155],min1;    for(int i=1;i<=ans;i++)    {        dis[i]=map1[1][i];///初始化dis数组    }    memset(vis,0,sizeof(vis));    vis[1]=1;///我们是以起始点为源点,所以先将起始点标记    for(int i=1;i<=ans;i++)    {        min1=INF;        for(int j=1;j<=ans;j++)        {            if(dis[j]<min1&&!vis[j])            {                min1=dis[bj=j];            }        }        if(min1==INF)            break;        vis[bj]=1;        for(int j=1;j<=ans;j++)///更新距离        {            if(!vis[j]&&dis[j]>dis[bj]+map1[bj][j])                dis[j]=dis[bj]+map1[bj][j];        }    }    if(dis[2]<INF)        printf("%d\n",dis[2]);    else        printf("-1\n");}int main(){    int d,n;    int f;    char s1[35],e1[35];    while(~scanf("%d",&n)&&(n!=-1))    {        map<string,int> q;///定义一个map数组        f=0;        for(int i=1;i<=155;i++)        {            for(int j=1;j<=155;j++)            {                if(i==j)                    map1[i][j]=0;                else                    map1[i][j]=INF;            }        }        scanf("%s %s",s1,e1);        if(strcmp(s1,e1)==0)///用于判断两地是否一样,如果一样就直接输出0            f=1;        q[s1]=1;///将起始点和目的地映射为1,2        q[e1]=2;        ans=3;        for(int i=1;i<=n;i++)        {            scanf("%s %s %d",s1,e1,&d);            if(!q[s1])///如果该地没有被映射过,就一一换成int类型,方便判断,ans的终值也可以代表有多少个地方                q[s1]=ans++;            if(!q[e1])                q[e1]=ans++;            map1[q[s1]][q[e1]]=map1[q[e1]][q[s1]]=d;///双向记录距离        }        if(f)            printf("0\n");        else            Dijkstra();    }    return 0;}