zoukankan      html  css  js  c++  java
  • 济大路痴

    Problem Description

    胡小宝从来都是分不清东南西北的,这也难怪来济大快两年了还经常在八食和二食之间迷路,这真是件令人头疼的事。这不,新学期分新宿舍,小宝分到了南苑(这也太真实了),然鹅,济大教室聚集在北苑,哈哈,这对胡小宝来说简直是噩梦。同为济大人,热心的你能不能帮帮小宝呢?

    请帮助他选出一条到达目的地的最短路线。

    Input

    输入数据有多组,每组的第一行是可能经过的地点间的路线条数N(0<N<=1000),第二行是两个字符串(s,e)表示起点和终点,接下来的N行是两个字符串(p1,p2)表示地名(0<p1,p2长度<35)和一个整数(d)表示这两个地点间的距离(0<d<1000)。

    note:一组数据中地名数不会超过150个。如果N==-1,表示输入结束

    Output

    对于每组测试数据,请在一行输出起点到终点的最短路线(两个地点间用-->隔开)以及距离

    Sample Input

    9

    学生公寓24号楼 信息楼

    学生公寓24号楼 济大西南门 200

    学生公寓24号楼 天桥 150

    学生公寓24号楼 济大东南门 450

    学生公寓24号楼 狗洞 200

    天桥 信息楼 300

    狗洞 济大东南门 350

    狗洞 信息楼 300

    济大东南门 信息楼 50

    济大西南门 信息楼 500

    1

    济大超市 济大超市

    洗浴中心 济大超市 50

    -1

    Sample Output

    学生公寓24号楼-->天桥-->信息楼 450

    济大超市 0

    #include <stdio.h>
    #include <string.h>
    
    #define INF 2000000000
    #define MAX 155
    
    int search(char place[][35],char* p)  //用于查找Place中是否已经存在p
    {
      int i;
      for (i=1; i<MAX; i++)                //如果存在则返回其下标
        if (strcmp(place[i],p)==0)
          return i;
      return -1;                        //不存在则返回-1
    }
    
    int dijkstra(int map[][MAX], int pre[], int num, int sp, int ep)
    {
      int dist[MAX];    //起点到其他地点的最短距离
      int s[MAX];        //集合s,存放已找出最短路径的地点
      int min;
      int u;
      int i, j;
      //初始化数组
      memset(dist,0,sizeof(dist));
      memset(s,0,sizeof(s));
      memset(pre,0,sizeof(pre));
      for (i=1; i<=num; i++)
      {
        dist[i] = map[sp][i];
        pre[i] = sp;
      }
      dist[sp] = 0;
      s[sp] = 1;
      for (j=1; j<=num-1; j++)
      {
        min = INF;
        u = sp;
        for (i=1; i<=num; i++)
          if (dist[i]<min&&!s[i])
          {
            min = dist[i];
            u = i;
          }
        s[u] = 1;
        if (s[ep])            //如果终点以找出
          return dist[ep];    //返回起点到终点的最短距离
        for (i=1; i<=num; i++)
          if (map[u][i]!=INF&&!s[i]&&dist[i]>map[u][i]+dist[u])
          {
            dist[i] = map[u][i]+dist[u];
            pre[i] = u;
          }
      }
    }
    
    int main()
    {
        char place[MAX][35];      //用于存储各个不同的地点
        int map[MAX][MAX];        //将地点转换为数字,存储在map中
        int n;
        char start[35];
        char end[35];
        char p[35];
        int pre[MAX];
        char temp[MAX][35];
        int s,e;
        int a,b,c;
        int cnt;
        int t;
        int i,j;
        int dist;
        while (~scanf("%d",&n))
        {
          if (n==-1)
            break;
          memset(place,0,sizeof(place));
          cnt = 1;
          scanf("%s%s",start,end);
          for (i=0; i<MAX; i++)     //初始化map
            for (j=0; j<MAX; j++)
              map[i][j] = INF;
          for (i=0; i<n; i++)
          {
            scanf("%s",p);
            a = search(place,p);    //将p在place中的下标赋值給a
            if (a==-1)
            {
              strcpy(place[cnt],p);
              a = cnt;
              cnt++;
            }
            scanf("%s",p);
            b = search(place,p);    //将p在place中的下标赋值給a
            if (b==-1)
            {
              strcpy(place[cnt],p);
              b = cnt;
              cnt++;
            }
            scanf("%d",&c);
            map[a][b] = map[b][a] = c;    //无向图
          }
          s = search(place,start);
          e = search(place,end);
          dist = dijkstra(map, pre, cnt, s, e);
          t = e;
          for (i=1; i<MAX; i++)
          {
            if (t==s)
              break;
            strcpy(temp[i],place[t]);
            t = pre[t];
          }
          printf("%s",place[t]);
          for (i = i-1; i>=1; i--)
            printf("-->%s",temp[i]);
          printf(" %d
    ",dist);
        }
        return 0;
    }
    蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
  • 相关阅读:
    洛谷/SPOJ SP3267 题解
    洛谷P3834题解
    洛谷P2607题解
    可持久化0-1Trie树
    反悔贪心
    记录人生第一次面试
    赋值构造函数和赋值运算符
    使用VS2017遇到的一些小问题
    关于C++中extern的简单笔记
    MFC单文档
  • 原文地址:https://www.cnblogs.com/huwt/p/10051657.html
Copyright © 2011-2022 走看看