HDU Today (最短路径+map)

来源:互联网 发布:巴基斯坦 知乎 编辑:程序博客网 时间:2024/05/17 23:46

经过锦囊相助,海东集团终于度过了危机,从此,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

1、先开始感觉跟之前做的一样,就是把数字改成了字符串,但是想想就不知道该怎么把这两个一一对应上,看了参考原来是用map容器,今天学到了~map用起来还是很方便的,包含一下头文件map,声明map<,>m,将其初始化为0,然后就跟数组一样对应就好了。
2、然后就是用dijkstra,经过上一题的悲惨经历,虽然还有点没理解,不过能大概敲出来了= =
3、还有就是交的时候还re了两次,应该是因为数组越界了,所以在dijkstra求每一次的最小边时,如果求出的minn已经是inf了,就break已经不用再求了。

#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <string>#define inf 0x3f3f3f3f#include <map>using namespace std;int mapp[170][170], i, j, cst[170], vis[170], cnt;void dij(){    int p, minn;    memset(vis, 0, sizeof(vis));    for(i=1; i<=cnt; i++)        cst[i]=mapp[1][i];    vis[1]=1;    for(i=1; i<=cnt; i++){        minn=inf;        for(j=1; j<=cnt; j++){            if(cst[j]<minn && !vis[j])            {                p=j;                minn=cst[j];            }        }        if(minn==inf)break;        vis[p]=1;        for(j=1; j<=cnt; j++){            if(cst[p]+mapp[p][j]<cst[j] && !vis[j])                cst[j]=cst[p]+mapp[p][j];        }    }}int main(){    int N;    while(~scanf("%d", &N)){        if(N==-1)break;        map<string, int>mp;        mp.clear();        memset(mapp, inf, sizeof(mapp));        string s1, s2;        int flag=0;        cin>>s1>>s2;        if(s1==s2)flag=1;        mp[s1]=1;        mp[s2]=2;        cnt=3;        while(N--){            string ss1, ss2;            int c;            cin>>ss1>>ss2>>c;            if(!mp[ss1])mp[ss1]=cnt++;            if(!mp[ss2])mp[ss2]=cnt++;            mapp[mp[ss1]][mp[ss2]]=mapp[mp[ss2]][mp[ss1]]=c;        }        if(flag){printf("0\n"); continue;}        dij();        if(cst[2]==inf)printf("-1\n");        else printf("%d\n", cst[2]);    }    return 0;}
原创粉丝点击