單源最短路徑(算法導論24章)

最短路徑算法通常依賴最短路徑的一個重要性質:兩個結點之間的最短路徑包含其他的最短路徑。

最優子結構(動態規劃和貪心算法指標):最短路徑的子路徑也是最短路徑。

初始化操作(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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章