济大路痴

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;
}
蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
原文地址:https://www.cnblogs.com/huwt/p/10051657.html