用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<G.vexnum;++v){
  8.         final[v]=FALSE;         //当其为TRUE时 表明已求得最短路径
  9.         D[v]=G.arcs[v0][v].adj;
  10.         for(int w=0;w<G.vexnum;++w) P[v][w]=FALSE;//设空路径
  11.         if(D[v]<INFINITY){
  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;++i){    ///其余G.vexnum-1各顶点//循环n-1次结束
  20.         min=INFINITY;           //当前离所知的顶点v0的最近距离
  21.         for(int w1=0;w1<G.vexnum;++w1)
  22.             if(!final[w1])      //w顶点在V-S中
  23.                 if(D[w1]<min){
  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<G.vexnum;++j)
  31.             if(P[v][j])printf("%c",G.vexs[j]);//输出最短路径上的所有顶点
  32.         for(int w2=0;w2<G.vexnum;++w2)  //更新当前最段路径机距离
  33.             if(!final[w2]&&(min+G.arcs[v][w2].adj<D[w2])){//修改D[w2]和P[w2]
  34.                 D[w2]=min+G.arcs[v][w2].adj;
  35.                 for(int s=0;s<G.vexnum;++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. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值