README.
最短路径问题是我们在图论中经常碰到的问题之一,其通用可以描述为从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。解决最短路的问题有以下算法,A*
,其中
-
单源最短路径定义为,给定起始顶点
s ,找出从s 到图中其它各顶点的最短路径。求解单源最短路径的算法主要是Dijkstra 算法和Bellman-Ford 算法,其中Dijkstra 算法主要解决所有边的权为非负的单源最短路径问题,而Bellman-Ford 算法可以适用于更一般的问题,图中边的权值可以为负。 -
全源最短路径定义为,找出连接图中各对顶点的最短路径。求解全源最短路径的算法主要有
Floyd 算法和Johonson 算法,其中Floyd 算法可以检测图中的负环并可以解决不包括负环的图中的全源最短路径问题;Johonson 算法同样也是解决不包含负环的图的全源最短路径问题,但是其算法效率更高。
最优子结构
最短路径算法具有最短路径的最优子结构性质,也就是两顶点之间的最短路径包括路径上其它顶点的最短路径。具体描述为:对于给定的带权图p=<v1, v2, …,vk>
是从pij=<vi, vi+1, …, vj>
为d[w]<d[v]+ ω(v, w)
,所以对
我们用
Relax(v, w, ω(v, w))
if d[w]>d[v] + ω(v, w)
{d[w]=d[v] + ω(v, w); p[w] = v;}