Dijkstra 算法

        

          距离即为从u到v的最小值 记为δ(u,v),如果不存在最小值,则记为无穷大

          单元最短路径问题:有一个图G=(V,E)和权重w  还有一个特定的源节点s,定义这个最短距离和最短路径是这个源节点到图中每个节点的最短距离与路径

          注:权重可以是负的

          Dijstra's算法的大致思路

           1.维持d[v]和S

               d[v] 是到每一个元素的最短的长度

               S 是我们已知的真正的距离的节点的集合

            2. 初始化

                S最初为空

                d[s]=0 and d[v]为无穷大

             3. 一个节点一个节点的遍历 直到全部加入S中

              问题1:

                 怎样选择下一个加入到S的节点

             回答:  使用一个贪心算法

                      (1)对于每一个节点u不属于S  我们计算一个距离上界d[u]

                      (2)下一个节点总是不属于S的节点中d[u]最小的节点,也就是说我们选择最接近的没有加工的节点

             当前的距离上界v :d[v];

             vertex u just added to S.edge(u,v) with weight w(u,v)


                当前到v的最短路径为d[v]

                新的路径d[u]+w(w,v)

                         if   d[u]+w(w,v)<d[v]

                              d[v]=d[u]+w(w,v)   这叫做relaxing an edge


   问题2:

        我们怎样有效的选择节点?

    答案:

         我们存储V\S节点在一个优先队列中,每个节点的值为d[v】

           我们使用一个堆来实现这个优先队列  我们需要使用Insert(),Extraxt-min()   和 Decrease-Key()   时间复杂度为O(logn)




         定理:一个最短路径的子路径仍然为最短路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值