• 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 }
           
  • 相关阅读:
    校园活动管理-毕业设计
    Golang时间字符串转换计算器
    5.21 Go秘籍:异步收割,永葆单身
    Golang东北之旅—channel
    Python3下载豆瓣音乐人小站音乐
    一张图记住4种树
    人生如锁
    Golang构造二叉树解决整数排序问题
    用Golang单元测试写作文
    Golang定时任务表达式合法性校验
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3097595.html
Copyright © 2020-2023  润新知