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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 8_5_2.c                     */
  3. /*    找寻加权图形的最短路径(Floyd方法)     */
  4. /* ======================================== */
  5. #define MAXLEN  1000              /* 最长可能距离         */
  6. int cost[7][7];                   /* 图形的邻接数组       */
  7. int dist[7][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.       cost[to][from] = node[i*3+2]; /* 存入图形           */
  22.    }
  23. }
  24. /* ---------------------------------------- */
  25. /*  找寻各顶点到各顶点的最短距离            */
  26. /* ---------------------------------------- */
  27. void shortestpath(int num)
  28. {
  29.    int i,j,k;
  30.    for ( i = 1; i <= num; i++ )   /* 初始数组回路         */
  31.       for ( j = 1; j <= num; j++ )
  32.          if ( i != j )
  33.             dist[i][j] = cost[i][j];  /* 初始距离         */
  34.          else
  35.             dist[i][i] = 0;       /* 清除对角线距离       */
  36.    for ( k = 1; k <= num; k++ )   /* 找最短距离回路       */
  37.       for ( i = 1; i <= num; i++ )
  38.          for ( j = 1; j <= num; j++ )
  39.             if ( dist[i][k] + dist[k][j] < dist[i][j] )
  40.                /* 设为较短距离 */
  41.                dist[i][j] = dist[i][k] + dist[k][j];
  42. }
  43. /* ---------------------------------------- */
  44. /*  主程式: 建立图形后,从各顶点开始找寻到各 */
  45. /*  顶点的最短距离,然后将计算结果印出.      */
  46. /* ---------------------------------------- */
  47. void main()
  48. {
  49.    int node[7][3] = {  {1, 2, 35},  /* 加权边线数组       */
  50.                        {2, 3, 45},
  51.                        {2, 4, 30},
  52.                        {3, 5, 25},
  53.                        {4, 5, 45},
  54.                        {4, 6, 130},
  55.                        {5, 6, 100} };
  56.    int i,j;
  57.    for ( i = 1; i <= 6; i++ )
  58.       for ( j = 1; j <= 6; j++ )
  59.          cost[i][j] = MAXLEN;     /* 设定数组最长距离     */
  60.    creategraph(node,7);           /* 建立加权图形         */
  61.    printf("加权图形的邻接数组内容:n");
  62.    for ( i = 1; i <= 6; i++ )
  63.    {
  64.       for ( j = 1; j <= 6; j++ )
  65.          printf(" %4d ",cost[i][j]);  /* 印出加权数组内容 */
  66.       printf("n");                   /* 换行             */
  67.    }
  68.    shortestpath(6);                   /* 找寻最短路径     */
  69.    printf("n从各顶点到各顶点最近距离:n");
  70.    printf("顶点1     2     3     4     5     6n");
  71.    for ( i = 1; i <= 6; i++ )
  72.    {
  73.       for ( j = 1; j <= 6; j++ )
  74.          printf(" %4d ",dist[i][j]);  /* 印出最短距离数组 */
  75.       printf("n");                   /* 换行             */
  76.    }
  77. }