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

来源:互联网 发布:淘宝哪家水货手机好 编辑:程序博客网 时间:2024/05/01 17:53
  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. }
原创粉丝点击