用Dijkstra算法求图最短路径

 
  1. Status ShortestPath_DIJ(MGraph G,VertexType vv,int P[][100],int D[]){
  2.     //用Dijkstra算法求G的v0到其余顶点v的最短路径及其带权长度D[v]
  3.     //若P[v][w]为TRUE,则w是从v0到w的当前最短路径的顶点
  4.     //当final[v]为TRUE时 表明已求得最短路径
  5.     int v0=LocateVex(G,vv);
  6.     int final[10];
  7.     for(int v=0;v
  8.         final[v]=FALSE;         //当其为TRUE时 表明已求得最短路径
  9.         D[v]=G.arcs[v0][v].adj;
  10.         for(int w=0;w//设空路径
  11.         if(D[v]
  12.             P[v][v0]= TRUE;
  13.             P[v][v]=TRUE;
  14.         }
  15.     }//for
  16.     D[v0]=0;final[v0]=1;        //初始化,v0顶点属于S集
  17.     printf("%c到 v顶点的最短距离及途经顶点/n",vv);
  18.     int min=0;                  //开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集
  19.     for(int i=1;i///其余G.vexnum-1各顶点//循环n-1次结束
  20.         min=INFINITY;           //当前离所知的顶点v0的最近距离
  21.         for(int w1=0;w1
  22.             if(!final[w1])      //w顶点在V-S中
  23.                 if(D[w1]
  24.                     v=w1;
  25.                     min=D[w1];  //w1离顶点v0最近
  26.                 }
  27.         final[v]=TRUE;          //离v0点最近的v加入S集
  28.         printf("/n    %c%8d",G.vexs[v],min);//输出函数部分
  29.         printf("        ");
  30.         for(int j=0;j
  31.             if(P[v][j])printf("%c",G.vexs[j]);//输出最短路径上的所有顶点
  32.         for(int w2=0;w2//更新当前最段路径机距离
  33.             if(!final[w2]&&(min+G.arcs[v][w2].adj//修改D[w2]和P[w2]
  34.                 D[w2]=min+G.arcs[v][w2].adj;
  35.                 for(int s=0;s
  36.                 P[w2][s]=P[v][s];
  37.                 P[w2][w2]=TRUE;     //P[w2]=P[v]+P[w2]
  38.             }//if
  39.     }//for
  40.     printf("/n");
  41.     return OK;
  42. }

你可能感兴趣的:(用Dijkstra算法求图最短路径)