Dijkstra算法

维基百科上写的还比较清楚。dj算法是求单源最短路径的算法。

  function Dijkstra(G, w, s)
     for each vertex v in V[G]                     // 初始化
           d[v] := infinity                             // 将各点的已知最短距离先设置成无穷大
           previous[v] := undefined                     // 各点的已知最短路径上的前趋都未知
     d[s] := 0                       // 因为出发点到出发点间不需移动任何距离,所以可以直接将s到s的最小距离设为0
     S := empty set
     Q := set of all vertices
     while Q is not an empty set                 // Dijkstra演算法主體
           u := Extract_Min(Q)
           S.append(u)
           for each edge outgoing from u as (u,v)
                  if d[v] > d[u] + w(u,v)         // 拓展边(u,v)。w(u,v)为从u到v的路径长度。
                        d[v] := d[u] + w(u,v)           // 更新路径长度到更小的那个和值。
                        previous[v] := u               // 记录前趋顶点

上面是伪代码。其中previous是记录了一个节点的前驱。这是为了在找到最短路径之后能从路径终点回溯到起始点。

回溯过程如下:

1 s := empty sequence 
2 u := t
3 while defined u                                        
4       insert u to the beginning of S
5       u := previous[u]      //previous数组即为上文中的p

序列S中就是从起始点到t点的路径了。

其中Extract_Min方法是找到S集合中到Q集合的最短路径长度所对应的那个点u,然后把u加到S集合中【Q集合在慢慢减小直到为空】。

Extract_Min可以使用一个数组,每次遍历数组来找到最小值。也可以使用其他稍微优化的方法,比如说小顶堆。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值