Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“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,表示输入结束。
第二行有徐总的所在地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
题目涉及的算法并不是很难,数据范围非常亲和,Floyd都能做。但是字符串的处理让人第一次接触还是有些头大的,所以笔者写这篇博客来简单保存一下自己想法。如有不当,恳请指正。
下面主要是利用map<string,int>把字符串和数字对应起来,通过写一个函数,方便地新建关系或者读取元素的值。算法这里用了floyd,其实不是很好的办法,但对于这道题是足够的。
#include<iostream>
#include<cstdio>
#include<map>
#include<string.h>
using namespace std;
#define INF (1e9+7)
int trip[155][155];
//-------字符串转换-------
string S,E;//保存起始点的站点名
int X,Y;
int namecnt;//统计站点名数量,每组数据开始赋初值0;
map<string,int>name;
int sn(string s)
{
if(name.count(s))return name[s];
//如果name已经储存了map元素,返回[s]的编号
return name[s]=++namecnt;
//如果没有,新建一个对应关系,标记+1
}
//-----------------------
int main()
{
string s1,s2;
int x,y,m,z;
while(cin>>m&&~m)//输入m且m不等于-1
{
//-------初始化过程--------
namecnt=0;
name.clear();
memset(trip,155,sizeof(trip));
for(int i=1;i<=155;i++)trip[i][i]=0;
//-------------------------
cin>>S>>E,X=sn(S),Y=sn(E);
for(int i=1;i<=m;i++)
{
cin>>s1>>s2>>z;
x=sn(s1);y=sn(s2);//把字符串都转换成数字标记
trip[x][y]=trip[y][x]=z;
}
for(int k=1;k<=namecnt;k++)
for(int i=1;i<=namecnt;i++)
for(int j=1;j<=namecnt;j++)
if(trip[i][j]-trip[k][j]>trip[i][k])
trip[i][j]=trip[i][k]+trip[k][j];
if(trip[X][Y]>=INF)printf("-1\n");
else printf("%d\n",trip[X][Y]);
}
return 0;
}