最短路徑算法通常依賴最短路徑的一個重要性質:兩個結點之間的最短路徑包含其他的最短路徑。
最優子結構(動態規劃和貪心算法指標):最短路徑的子路徑也是最短路徑。
初始化操作(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)