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