对严老师的Dijkstra算法中path数组有点疑问以及个人的简化

本文深入解析Dijkstra算法中path数组的使用及其背后的逻辑,包括path[w]=path[v]+[w]这行代码的意义,通过详细解释帮助读者掌握算法的核心实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Dijkstra算法中path保存路径上的节点

但是有行代码开始我不理解,就是       path[w] =path[v];  path[w][w] =1;    //path[w] =path[v]+[w]

开始我的理解是:  path[w] =path[v];   应该是后面代码的简写:  for (j=0;j<G.vexnum;j++)  path[w][j] =path[v][j]; 

但是就算是上面的理解,那么对于 path[w] =path[v]+[w]  这个注释我就不理解了

 

下面这段代码拷贝自王道的指导全书


void ShortesPath_DIJ(MGraph G,int V0){

      for (v=0;v<G.vexnum;v++){

        final[v]=0; dist[v] = G.arc[v0][v];

    

     for (w=0;w<G.vexnum;w++)  path[v][w] =0;

     if(dis[v]<INFINITY) { path[v][v0]=1;  path[v][v]=1;}

 

    }

    dist[v0]=-;   final[v0]=1;

  

    for(i=1;i<G.vexnum ;i++){

    min=INFINITY;

    for(w=0;w<G.vexnum;w++){

         if(!final[w]&&dist[w]<min)

             {  v=w; m= dist[w];}

         final[v]=1;

        

        for(w=0;w<G.vexnum;w++){

            if(!final[w] && dist[w]>min+G.arc[v][w])

              {dist[w] = min+G.arc[v][w];

                 path[w] =path[v];  path[w][w] =1;    //path[w] =path[v]+[w]

              }

     }

 

}

 


其实,对于path一维数组的实现在Mark.Allen.Weiss的数据结构与算法分析–C++.描述(第3版)就有,Mark.Allen.Weiss的Dijkstra的实现就用到了ptah[v]来保存到源点达到v定点前的一个定点,最后要得到路径,只要递归输出path就行了,下面的是c++的实现
printPath(Vextex v){
   if(v.path !=NOT_A_VERTEX){
          printPath(v.path)  //如果c实现并且用一维数组,相应代码是 printPath(path[v])
            count << " to ";          
 }
 count << v;
}


补充Mark.Allen.Weiss的Dijkstra算法实现的C++的数据结构
struct Vertex{
    List adj;
    bool  know;
     DistType dist;
     Vertex path;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值