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

 

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;
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用[1]和引用,Dijkstra算法的辅助数组d是一个一维数组,用于存储源节点到各个节点的最短距离。在算法开始时,源节点的最短距离被初始化为0,其他节点的最短距离被初始化为无穷大。在算法的执行过程,d数组会被不断更新,直到所有节点的最短距离都被确定。 具体来说,算法会从源节点开始,依次遍历与其相邻的节点,并计算出从源节点到这些节点的距离。如果这些节点的距离比它们当前存储的最短距离更短,那么它们的最短距离就会被更新为新的更短的距离。这个过程会一直持续,直到所有节点的最短距离都被确定。 下面是一个示例代码,演示了如何使用Dijkstra算法来计算一个有向图的最短路径和辅助数组d: ```python import heapq def dijkstra(graph, start): # 初始化距离数组d d = [float('inf')] * len(graph) d[start] = 0 # 使用堆来存储节点和距离 heap = [(0, start)] while heap: # 弹出堆距离最小的节点 (dist, node) = heapq.heappop(heap) # 遍历与该节点相邻的节点 for neighbor, weight in graph[node].items(): # 计算从源节点到该节点的距离 distance = dist + weight # 如果距离更短,更新d数组和堆 if distance < d[neighbor]: d[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return d # 示例图 graph = [ {1: 4, 2: 2}, {3: 2}, {1: 8, 3: 7}, {4: 1}, {}, ] # 计算从节点0到其他节点的最短距离和辅助数组d d = dijkstra(graph, 0) print(d) # 输出:[0, 4, 2, 6, inf] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值