HDU 2112 HDU Today(弗洛伊德算法)

                                    HDU Today

                                                   Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

                                                                            Total Submission(s): 9442    Accepted Submission(s): 2250

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
 
 
题目分析:首先将任意两点距离初始化为正无穷大,然后将每个站点名称映射到一个字符数组中,
       这样每个下标就代表着某个字符串的名称,然后用弗洛伊德算法求出任意两个站点之间的最短距离。
 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define INF 0x7ffffff
 5 
 6 const int MAX_LEN = 35;
 7 
 8 int disMap[MAX_LEN * 5][MAX_LEN * 5]; //记录站点之间的距离
 9 char statName[MAX_LEN * 5][MAX_LEN];  //记录站点的名称
10 int  totalMark = 0;                   //标识站点名称所在的下标
11 
12 void InitStationDis(int N)            //初始化数据
13 {
14     for(int i = 1; i <= 155; i++)
15     {
16         for(int j = 1; j <= 155; j++)
17         {
18             if(i == j)
19                 disMap[i][j] = 0;
20             else
21                 disMap[i][j] = INF;
22         }
23     }
24 }
25 
26 int FindStationName(char name[])      //查找name所在的下标位置
27 {
28     for(int i = 1; i <= totalMark; i++)
29     {
30         if(strcmp(statName[i], name) == 0)
31             return i;
32     }
33 
34     totalMark++;
35     strcpy(statName[totalMark], name);
36     return totalMark;
37 }
38 
39 void floyd(int N)                     //floyd算法求最短距离
40 {
41     for(int k = 1; k <= N; k++)
42         for(int i = 1; i <= N; i++)
43             for(int j = 1; j <= N; j++)
44                 if(disMap[i][j] > disMap[i][k] + disMap[k][j])
45                     disMap[i][j] = disMap[i][k] + disMap[k][j];
46 }
47 
48 int main()
49 {
50     int N, disTemp;
51     char sName[MAX_LEN], eName[MAX_LEN];
52     char sTemp[MAX_LEN], eTemp[MAX_LEN];
53 
54     while(scanf("%d", &N) && N != -1)
55     {
56         getchar();
57         InitStationDis(N);
58 
59         scanf("%s %s", sName, eName);//将起始位置和终点位置插入到数组
60         FindStationName(sName);      //映射站点名称到statName数组
61         FindStationName(eName);
62 
63         for(int i = 0; i < N; i++)
64         {
65             scanf("%s %s %d", sTemp, eTemp, &disTemp);
66 
67             int sMark = FindStationName(sTemp);
68             int eMark = FindStationName(eTemp);
69             if(disMap[sMark][eMark] > disTemp)//注意无向图和重边判断
70             {
71                 disMap[sMark][eMark] = disTemp;
72                 disMap[eMark][sMark] = disTemp;
73             }
74         }
75         floyd(totalMark);
76         int s = FindStationName(sName);
77         int e = FindStationName(eName);
78         if(disMap[s][e] < INF)
79             printf("%d\n", disMap[s][e]);
80         else
81             printf("-1\n");
82     }
83 
84     return 0;
85 }

 

       
posted @ 2013-05-24 21:00  Dreamcaihao  阅读(244)  评论(0编辑  收藏  举报