弗洛伊德算法求每一对顶点之间的最短路径

  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. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值