单源最短路径
问题
给定一个加权有向图G,找出从一个给定源点s到其他各点v的最短路径。
最优子结构
最短路径由最短子路径组成。
证明:
suppose some subpath is not a shortest path
○ There must then exist a shorter subpath
○ Could substitute the shorter subpath for a shorter path
○ But then overall path is not shortest path. Contradiction
最短路径性质
三角不等式
证明:
1)若x在u,v的最短路径上,则取等号;
2)若不在,则假设大于,那么两个小路径相加得到比u、v原最短路径更短的路径,那么这与(u,v)为最短路径相驳,故必不取大于号。
综上,得证。
有负环的图不存在最短路径
因为一直走负环则总权重越来越小,可不断变小,无法确定最小值,故无最短路径。
Relaxation
Bellan-ford算法
时间复杂度:O(VE)
循环|V|-1次,每次对每条边做Relaxation。
Bellan-ford算法的改进思路
由拓扑排序找出可能的最短路径,即找出可能的路径顺序,进行有意义的迭代relax,减少无意义的迭代。
Dijkstra’s Algorithm
介绍
若图中无负环,则必bellman-ford算法更好。其实对于有向图才有意义。
● Similar to breadth-first search
■ Grow a tree gradually, advancing from vertices
taken from a queue
● Also similar to Prim’s algorithm for MST
■ Use a priority queue keyed on d[v]
1.初始化所有点的d值即key值为无穷大。
2.当Q不为空,每次取出Q中d值即key最小的点,对他的邻接点进行松弛操作,更新key值,直至Q为空。
时间复杂度
算法的时间复杂度(取决于数据结构):
A: O(E lg V) using binary heap for Q
Can acheive O(V lg V + E) with Fibonacci heaps
迪杰斯特拉复杂度分析:
1)while + ExtractMin: VlgV
2)while + for +Decreasekey: ElgV
3)总: VlgV + ElgV=O(ElgV) (因为:V比E小)
证明算法的正确性
Correctness: we must show that when u is
removed from Q, it has already converged。
证明:
定理:所有未找到最短路径的节点中,键值最小的节点的最短路径值等于键值,并且其最短路径为初始节点到确定其键值的节点再到它。
引理:
此为证明不可能在S集合外有一点y存在于u的最短路径上(du为S外最小值)