《算法导论》单源最短路径笔记
问题描述:给定一个图G=(V,E),我们希望找到从给定源结点到每个结点v的最短路径
解决思路:两个结点之间的一条最短路径包含着其他的最短路径。
注:最短路径不能包含权重为负值的环路。当图中不含负权重边的时候我们可以使用Dijkstra算法来找到所有从源结点出发最短的路径。当图中含有负权重边的时候我们使用效率低一些的Bellman-Ford算法,在找寻最短路径的同时不断判断图中是否包含负权重环路。
1. 松弛操作(Relaxation)
我们将结点v的前驱记作v.pi,v到源点的最短距离为v.d。我们首先将d初始化为无穷大,pi初始化为NULL。
然后我们便可以使用任意一种寻找最短路径的算法来遍历图中的点并更新点到源点的最短路径了。
其中更新最短路径的操作也叫做放松(relax),伪代码如下:
2. Bellman-Ford
Bellman-Ford算法解决的是一般情况下的单源最短路径问题。通过对边进行松弛