迪杰斯特拉算法求最短路径

  1. #include <stdio.h>
  2. #define INFINITY 10000
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define VERTEX_NUM 6
  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  v0, int  p[][VERTEX_NUM], int  d[])
  14. {
  15. /*迪杰斯特拉算法求最短路径,g为图的邻接矩阵,v0为起始顶点,
  16. p[v][w]储存v0到v路径上w的后继顶点(无后继置-1),d[v]为路径v0到v的带权长度*/
  17.      int  v;
  18.      int  w;
  19.      int  min;
  20.      int  i,j;
  21.      int  final[VERTEX_NUM];   /*final[v]=TRUE当且仅当v属于S*/
  22.     
  23.      /*初始化数组*/
  24.      for  (v = 0; v < g.vexnum; v++)
  25.     {
  26.         final[v] = FALSE;
  27.         d[v] = g.arcs[v0][v];
  28.          for  (w = 0; w < g.vexnum; w++)
  29.         {
  30.             p[v][w] = -1;
  31.         }
  32.          if  (d[v] < INFINITY)
  33.         {
  34.             p[v][v0] = v;
  35.         }
  36.     }
  37.      /*初始化,顶点v0属于S集合*/
  38.     d[v0] = 0;
  39.     final[v0] = TRUE;
  40.      /*循环n-1次求最短路径*/
  41.      for  (i = 1; i < g.vexnum; i++)      
  42.     {
  43.         min=INFINITY;
  44.          for  (w = 0; w<g.vexnum; w++)
  45.         {
  46.              if  (!final[w])   /* w属于V-S */
  47.             {
  48.                  if  (d[w] < min)
  49.                 {
  50.                      /* w顶点离v0更近 */
  51.                     v=w;
  52.                     min=d[w];
  53.                 }
  54.             }
  55.         }
  56.         final[v] = TRUE;     /*离v0顶点最近的v加入S集*/
  57.          for  (w = 0; w<g.vexnum; w++)     /*更新当前最短路径及距离*/
  58.         {
  59.              if  (!final[w] && (min+g.arcs[v][w] < d[w]) )
  60.             {   
  61.                  /*修改d[w]和p[w] (w属于V-S) */
  62.                 d[w] = min + g.arcs[v][w];
  63.                  for  (j = 0; j < VERTEX_NUM; j++)
  64.                 {
  65.                     p[w][j] = p[v][j];   /* p[w]=p[v] */
  66.                 }
  67.                 p[w][v] = w;         /* p[w]=p[v]+w */
  68.             }
  69.         }
  70.     }
  71. }
  72. void  main()
  73. {
  74.      int  i,
  75.         j;
  76.     Graph g;
  77.      int  p[VERTEX_NUM][VERTEX_NUM];
  78.      int  d[VERTEX_NUM];
  79.      int  v0;
  80.      /*初始化图g*/
  81.     g.vexs[0]= 'A' ,g.vexs[1]= 'B' ,g.vexs[2]= 'C' ,g.vexs[3]= 'D' ,g.vexs[4]= 'E' ,g.vexs[5]= 'F' ;
  82.      for (i=0;i<VERTEX_NUM;i++)
  83.          for (j=0;j<VERTEX_NUM;j++)       
  84.             g.arcs[i][j]=INFINITY;
  85.     g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
  86.         g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
  87.     g.vexnum=g.arcnum=VERTEX_NUM;
  88.      /*输出图的有关信息*/
  89.      for (i=0;i<VERTEX_NUM;i++)
  90.     {
  91.         printf( "%c/t" ,g.vexs[i]);
  92.          for (j=0;j<VERTEX_NUM;j++)
  93.         {
  94.             printf( "%5d " ,g.arcs[i][j]);
  95.         }
  96.         printf( "/n" );
  97.     }
  98.     printf( "/n" );
  99.      /*求最短路径*/
  100.     v0 = 0;
  101.     ShortestPath(g,v0,p,d);
  102.      /*输出最短路径*/
  103.      for  (i = 0; i < g.vexnum; i++)
  104.     {
  105.         printf( "Path %c to %c:/n" ,g.vexs[v0],g.vexs[i]);
  106.          if  ( p[i][v0] != -1 )    /*存在路径则输出*/
  107.         {
  108.              for  (j = v0; j != -1; j = p[i][j])
  109.             {
  110.                  if  (j != v0)
  111.                     printf( "→" );
  112.                 printf( "%c" ,g.vexs[j]);
  113.             }
  114.             printf( "/n" );
  115.         }
  116.         printf( "Length:%d/n" ,d[i]);
  117.         printf( "/n" );
  118.     }
  119. }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值