距离即为从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)
定理:一个最短路径的子路径仍然为最短路径