8_5_1.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 8_5_1.c                     */
  3. /*    找寻加权图形的最短路径(Dijkstra方法)  */
  4. /* ======================================== */
  5. #define MAXLEN  1000              /* 最长可能距离         */
  6. int cost[7][7];                   /* 图形的邻接数组       */
  7. int dist[7];                      /* 路径长度数组         */
  8. /* ---------------------------------------- */
  9. /*  建立加权图形                            */
  10. /* ---------------------------------------- */
  11. void creategraph(int *node,int num)
  12. {
  13.    int from;                      /* 边线的起点           */
  14.    int to;                        /* 边线的终点           */
  15.    int i;
  16.    for ( i = 0; i < num; i++ )    /* 读取边线的回路       */
  17.    {
  18.       from = node[i*3];           /* 边线的起点           */
  19.       to = node[i*3+1];           /* 边线的终点           */
  20.       cost[from][to] = node[i*3+2]; /* 存入图形           */
  21.    }
  22. }
  23. /* ---------------------------------------- */
  24. /*  找寻某顶点到各顶点的最短距离            */
  25. /* ---------------------------------------- */
  26. void shortestpath(int begin,int num)
  27. {
  28.    int selected[7];               /* 选择顶点数组         */
  29.    int min;                       /* 最短距离             */
  30.    int s;                         /* 最短距离的顶点       */
  31.    int i,j;
  32.    for ( i = 2; i <= num; i++ )   /* 初始数组回路         */
  33.    {
  34.       selected[i] = 0;            /* 清除数组内容         */
  35.       dist[i] = cost[begin][i];   /* 初始距离             */
  36.    }
  37.    selected[begin] = 1;           /* 设定找过开始顶点     */
  38.    dist[begin] = 0;               /* 设定开始顶点距离     */
  39.    printf("顶点1    2     3     4     5     6n");
  40.    for ( j = 1; j <= num; j++ )   /* 列印初始数组内容     */
  41.          printf(" %4d ",dist[j]); /* 印出距离             */
  42.    printf("n");                  /* 换行                 */
  43.    for ( i = 1; i <= num - 1; i++ )
  44.    {
  45.       min = MAXLEN;               /* 先设为最长距离       */
  46.       for ( j = 1; j <= num; j++ )/* 找最短距离回路     */
  47.          /* 从数组找寻最近距离顶点 */
  48.          if ( min > dist[j] && selected[j] == 0 )
  49.          {
  50.             s = j;                /* 目前最短的顶点       */
  51.             min = dist[j];        /* 记录最短距离         */
  52.          }
  53.       selected[s] = 1;            /* 设定已找过           */
  54.       /* 计算开始顶点到各顶点最短距离数组回路 */
  55.       for ( j = 1; j <= num; j++ )
  56.       {
  57.          if ( selected[j] == 0 && /* 是否比较短           */
  58.               dist[s] + cost[s][j] < dist[j] )
  59.             /* 设为较短距离 */
  60.             dist[j] = dist[s] + cost[s][j];
  61.          printf(" %4d ",dist[j]); /* 列出最短距离         */
  62.       }
  63.       printf("n");               /* 换行                 */
  64.    }
  65. }
  66. /* ---------------------------------------- */
  67. /*  主程式: 建立图形后,从顶点1开始找寻到各  */
  68. /*  顶点的最短距离,然后将计算过程印出.      */
  69. /* ---------------------------------------- */
  70. void main()
  71. {
  72.    int node[7][3] = {  {1, 2, 35},  /* 加权边线数组       */
  73.                        {2, 3, 45},
  74.                        {2, 4, 30},
  75.                        {3, 5, 25},
  76.                        {4, 5, 45},
  77.                        {4, 6, 130},
  78.                        {5, 6, 100} };
  79.    int i,j;
  80.    for ( i = 1; i <= 6; i++ )
  81.       for ( j = 1; j <= 6; j++ )
  82.          cost[i][j] = MAXLEN;     /* 设定数组最长距离     */
  83.    creategraph(node,7);           /* 建立加权图形         */
  84.    printf("加权图形的邻接数组内容:n");
  85.    for ( i = 1; i <= 6; i++ )
  86.    {
  87.       for ( j = 1; j <= 6; j++ )
  88.          printf(" %4d ",cost[i][j]);  /* 印出加权数组内容 */
  89.       printf("n");                   /* 换行                 */
  90.    }
  91.    printf("n从顶点1到各顶点最近距离计算过程:n");
  92.    shortestpath(1,6);                /* 找寻最短路径         */
  93. }