hdu2112HDU Today(floyd+map数组对字符串的应用)

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?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
 
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
虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――

题意:乘公交车,地点双向。给出起点和终点。还有每两个城市之间的行车距离,要求计算从起点到终点的最短时间。

题解:因为城市的数量最多只有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\n");
44         else if(road[1][2]==inf)printf("-1\n");
45         else printf("%d\n",road[1][2]);
46     }
47     return 0;
48 }

猜你喜欢

转载自www.cnblogs.com/fqfzs/p/9893078.html