弗洛伊德演算法求每一對頂點之間的最短路徑

來源:互聯網
上載者:User
  1. #include <stdio.h>
  2. #define VERTEX_NUM 3
  3. #define INFINITY 10000
  4. #define TRUE 1
  5. #define FALSE 0
  6. typedef
     
    struct
     Graph
  7. {
  8.     
    char
     vexs[VERTEX_NUM];  
    /*頂點*/
  9.     
    int
     arcs[VERTEX_NUM][VERTEX_NUM];   
    /*鄰接矩陣*/
  10.     
    int
     vexnum;     
    /*頂點數*/
  11.     
    int
     arcnum;     
    /*弧數*/
  12. }Graph;
  13. void
     ShortestPath(Graph g,
    int
     p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM],
    int
     d[VERTEX_NUM][VERTEX_NUM])
  14. {
  15.     
    /*弗洛伊德演算法求每一對頂點之間的最短路徑*/
  16.     
    int
     v;
  17.     
    int
     w;
  18.     
    int
     u;
  19.     
    int
     i;
  20.     
    for
     (v = 0; v < g.vexnum; v++)
  21.         
    for
     (w = 0; w < g.vexnum; w++)
  22.         {
  23.             d[v][w] = g.arcs[v][w];
  24.             
    for
     (u = 0; u < g.vexnum; u++)
  25.                 p[v][w][u] = -1;
  26.             
    if
     (d[v][w] < INFINITY) 
    /*從v到w有直接路徑*/
  27.             {
  28.                 p[v][w][v] = w;
  29.             }
  30.         }
  31.     
    for
     (u = 0; u < g.vexnum; u++)
  32.         
    for
     (v = 0; v < g.vexnum; v++)
  33.             
    for
     (w = 0; w < g.vexnum; w++)
  34.                 
    if
     (d[v][u] + d[u][w] < d[v][w])    
    /*從v經u到w的一條路徑更短*/
  35.                 {
  36.                     d[v][w] = d[v][u] + d[u][w];
  37.                     
    for
     (i = 0; i < g.vexnum; i++)
  38.                     {
  39.                         
    if
      (p[v][u][i] !=  -1)
  40.                             p[v][w][i] = p[v][u][i];
  41.                         
    else
  42.                             p[v][w][i] = p[u][w][i];
  43.                     }
  44.                 }
  45. }
  46. void
     PrintPath ( Graph g, 
    int
     p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM],
    int
     d[VERTEX_NUM][VERTEX_NUM] )
  47. {
  48.     
    /*輸出最短路徑*/
  49.     
    int
     i,j,k;
  50.     
    for
     (i = 0; i < g.vexnum; i++)
  51.     {
  52.         
    for
     (j = 0; j < g.vexnum; j++)
  53.         {
  54.             printf(
    "Path %c to %c:/n"
    ,g.vexs[i],g.vexs[j]);
  55.             
    if
     ( p[i][j][i] == i )      
    /*頂點到自身*/
  56.                 printf(
    "%c/n"
    ,g.vexs[i]);
  57.             
    else
     
    if
     ( p[i][j][i] == -1 )    
    /*沒有路徑*/
  58.                 printf(
    "No path!/n"
    );
  59.             
    else
            
    /*存在路徑則輸出*/
  60.             {
  61.                 
    for
     (k = i; k != -1; k = p[i][j][k])
  62.                 {
  63.                     
    if
     (k != i)
  64.                         printf(
    "→"
    );
  65.                     printf(
    "%c"
    ,g.vexs[k]);
  66.                 }
  67.                 printf(
    "/n"
    );
  68.             }           
  69.             printf(
    "Length:%d/n"
    ,d[i][j]);
  70.             printf(
    "/n"
    );
  71.         }
  72.     }
  73. }
  74. void
     main()
  75. {
  76.     
    int
     i,
  77.         j;
  78.     Graph g;
  79.     
    int
     p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM];
  80.     
    int
     d[VERTEX_NUM][VERTEX_NUM];
  81.     
    /*初始化圖g*/
  82.     g.vexs[0]=
    'A'
    ,g.vexs[1]=
    'B'
    ,g.vexs[2]=
    'C'
    ;
  83.     
    for
    (i=0;i<VERTEX_NUM;i++)
  84.         
    for
    (j=0;j<VERTEX_NUM;j++)
  85.         {
  86.             
    if
     (i == j)
  87.                 g.arcs[i][j]=0;
  88.             
    else
  89.                 g.arcs[i][j]=INFINITY;
  90.         }
  91.     g.arcs[0][1]=4,g.arcs[0][2]=11,g.arcs[1][0]=6,g.arcs[1][2]=2,
  92.         g.arcs[2][0]=3;
  93.     g.vexnum=VERTEX_NUM;
  94.     g.arcnum=5;
  95.     
    /*輸出圖的有關資訊*/
  96.     
    for
    (i=0;i<VERTEX_NUM;i++)
  97.     {
  98.         printf(
    "%c/t"
    ,g.vexs[i]);
  99.         
    for
    (j=0;j<VERTEX_NUM;j++)
  100.         {
  101.             printf(
    "%5d "
    ,g.arcs[i][j]);
  102.         }
  103.         printf(
    "/n"
    );
  104.     }
  105.     ShortestPath(g,p,d);
  106.     PrintPath(g,p,d);
  107. }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.