• HDU Today


    Problem Description

    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。 这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。 徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗? 请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。

    Input

    输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000); 第二行有徐总的所在地start,他的目的地end; 接着有n行,每行有站名s,站名e,以及从se的时间整数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 虽然偶尔会迷路,但是因为有了你的帮助 ****从此还是过上了幸福的生活。 ――全剧终――

    Author

    lgx

     

    思路:把存放地名的字符串数组转换为dijkstra算法能用的数字编号数组

      1 #include <stdio.h>
      2 #include <string.h>
      3 
      4 #define INF 2000000000
      5 #define MAX 155
      6 
      7 int search(char place[][35],char* p)  //用于查找Place中是否已经存在p
      8 {
      9   int i;
     10   for (i=1; i<MAX; i++)                //如果存在则返回其下标 
     11     if (strcmp(place[i],p)==0)
     12       return i;
     13   return -1;                        //不存在则返回-1 
     14 }
     15 
     16 int dijkstra(int map[][MAX], int num, int sp, int ep)
     17 {
     18   int dist[MAX];    //起点到其他地点的最短距离 
     19   int s[MAX];        //集合s,存放已找出最短路径的地点 
     20   int min;
     21   int u;
     22   int i, j;
     23   if (sp==-1||ep==-1)    //如果place中没有起点或终点,则返回-1 
     24       return -1;
     25   //初始化数组 
     26   memset(dist,0,sizeof(dist));
     27   memset(s,0,sizeof(s));
     28   for (i=1; i<=num; i++)
     29   {
     30     dist[i] = map[sp][i];
     31   }
     32   dist[sp] = 0;
     33   s[sp] = 1;
     34   for (j=1; j<=num-1; j++)
     35   {
     36     min = INF;
     37     u = sp;
     38     for (i=1; i<=num; i++) 
     39       if (dist[i]<min&&!s[i])
     40       {
     41         min = dist[i];
     42         u = i;
     43       }
     44     s[u] = 1;
     45     if (s[ep])            //如果终点以找出 
     46       return dist[ep];    //返回起点到终点的最短距离 
     47     for (i=1; i<=num; i++)
     48       if (map[u][i]!=INF&&!s[i]&&dist[i]>map[u][i]+dist[u])
     49         dist[i] = map[u][i]+dist[u];
     50   }
     51   return -1;
     52 }
     53 
     54 int main()
     55 {
     56     char place[MAX][35];      //用于存储各个不同的地点
     57     int map[MAX][MAX];        //将地点转换为数字,存储在map中
     58     int n;
     59     char start[35];
     60     char end[35];
     61     char p[35];
     62     int s,e;
     63     int a,b,c;
     64     int cnt;
     65     int i,j;
     66     int dist;
     67     while (~scanf("%d",&n))
     68     {
     69       if (n==-1)
     70         break;
     71       memset(place,0,sizeof(place));    
     72       cnt = 1;
     73       scanf("%s%s",start,end);
     74       for (i=0; i<MAX; i++)     //初始化map
     75         for (j=0; j<MAX; j++)
     76           map[i][j] = INF;
     77       for (i=0; i<n; i++)
     78       {
     79         scanf("%s",p);
     80         a = search(place,p);    //将p在place中的下标赋值給a 
     81         if (a==-1)
     82         {
     83           strcpy(place[cnt],p);
     84           a = cnt;
     85           cnt++;
     86         }
     87         scanf("%s",p);
     88         b = search(place,p);    //将p在place中的下标赋值給a 
     89         if (b==-1)
     90         {
     91           strcpy(place[cnt],p);
     92           b = cnt;
     93           cnt++;
     94         }
     95         scanf("%d",&c);
     96         map[a][b] = map[b][a] = c;    //无向图 
     97       }
     98       s = search(place,start);
     99       e = search(place,end);
    100       dist = dijkstra(map, cnt, s, e);
    101       printf("%d
    ",dist);
    102     }
    103     return 0;
    104 }
    蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
  • 相关阅读:
    yum管理工具
    ansible简介,简单实用
    ssh服务简介及应用与服务的进程的类型
    keepliave
    NFS
    编译安装redis4.0
    redis多实例和高可用
    NTP时间服务
    ssl简介与openssl的使用
    一些高效学习方法-牛人是怎么来的
  • 原文地址:https://www.cnblogs.com/huwt/p/9971366.html
Copyright © 2020-2023  润新知