最短路径算法通常依赖最短路径的一个重要性质:两个结点之间的最短路径包含其他的最短路径。
最优子结构(动态规划和贪心算法指标):最短路径的子路径也是最短路径。
初始化操作(v.π=NIL,s.d=0,除s外v.d=∞):
INITIALIZE-SINGLE-SOURCE(G,s)
for each vertex v∈G.V
v.d=∞
v.π=NIL
s.d=0
对边(u,v)松弛操作(将s到u之间的最短距离加上w(u,v),并与当前s到v的最短距离比较更新):
RELAX(u,v,w)
if v.d>u.d+w(u,v)
v.d=u.d+w(u,v)
v.π=u
Bellman-Ford算法(贝尔曼-福特算法)反复松弛:
BELLMAN-FORD(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)
for i=1 to |G.V|-1
for each edge∈G.E
RELAX(u,v,w)
for each edge(u,v)∈G.E
if v.d>u.d+w(u,v)
return FALSE
return TRUE
Dijkstra算法(迪杰斯特拉算法):
在算法的运行过程中维持一组结点集合S。从源结点s到该集合中每个结点之间的最短路径都已经被找到。从V-S集合中选择最短路径估计最小的结点u,将u加入S,然后对所有从u发出的边进行松弛。我们使用一个最小优先队列Q来保存结点集合,每个节点的关键值为其d值。
DIJKSTRA.(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)
S=∅
Q=G.V
while Q≠∅
u=EXTRACT-MIN(Q)
S=S{u}
for each vertex v∈G.Adj[u]
RELAX(u,v,w)