HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 38420 Accepted Submission(s): 9298
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
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。
――全剧终――
题意:乘公交车,地点双向。给出起点和终点。还有每两个城市之间的行车距离,要求计算从起点到终点的最短时间。
题解:因为城市的数量最多只有150,所以可以用floyd算法。这题最关键的是他的地点是字符串,而不是编号,我们可以用map数组把字符串作为下标,给他赋一个编号。这样就和一般的一样了。要特判一下如果起点和终点重合,时间就是0。如果不能从给出的起点到终点,就输出-1。
1 #include<bits/stdc++.h> 2 using namespace std; 3 map<string,int>s; 4 char a[35],b[35]; 5 int road[155][155]; 6 const int inf=0x3f3f3f3f; 7 int n; 8 void floyd() { 9 for(int k=1; k<=152; k++) { 10 for(int i=1; i<=152; i++) { 11 for(int j=1; j<=152; j++) { 12 road[i][j]=min(road[i][j],road[i][k]+road[k][j]); 13 } 14 } 15 } 16 } 17 int main() { 18 19 while(~scanf("%d",&n)&&n!=-1) { 20 s.clear();//初始化 21 for(int i=0; i<155; i++) { 22 for(int j=0; j<155; j++) { 23 road[i][j]=inf; 24 } 25 road[i][i]=0; 26 } 27 scanf("%s %s",a,b); 28 int r=0; 29 if(!strcmp(a,b))r=1;//如果起点和终点相同 30 s[a]=1; 31 s[b]=2; 32 int ans=3; 33 int t; 34 for(int i=0; i<n; i++) { 35 scanf("%s %s %d",a,b,&t); 36 if(!s[a])s[a]=ans++;//如果map里面没有这个字符串,就给该字符串一个新的编号 37 if(!s[b])s[b]=ans++; 38 if(t<road[s[a]][s[b]]) { 39 road[s[a]][s[b]]=road[s[b]][s[a]]=t; 40 } 41 } 42 floyd(); 43 if(r)printf("0 "); 44 else if(road[1][2]==inf)printf("-1 "); 45 else printf("%d ",road[1][2]); 46 } 47 return 0; 48 }