1. 程式人生 > >最短路徑之Dijkstra算法

最短路徑之Dijkstra算法

最優解 bubuko 原來 body table 特點 修改 ble mil

  Dijkstra(迪傑斯特拉)算法是典型的最短路徑路由算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

  一、算法思想

  令G = (V,E)為一個帶權有向網,把圖中的頂點集合V分成兩組:已求出最短路徑的頂點集合S(初始時S中只有源節點,以後每求得一條最短路徑,就將它對應的頂點加入到集合S中,直到全部頂點都加入到S中);未確定最短路徑的頂點集合U-(V-S)。在加入過程中,總保持從源節點v到S中各頂點的最短路徑長度不大於從源節點v到V-S中任何頂點的最短路徑長度。

  二、算法描述

  (1)S為已經找到的從v出發的最短路徑的終點集合,它的初始狀態為空集

  技術分享圖片

  (2)從U中選取一個距離v最小的定點u,把u加入S中,(該選定的距離就是v->u的最短路徑長度)

  技術分享圖片

  (3)以u為新考慮的中間點,修改U中各頂點j的最短路徑長度:若從源點v到頂點j(j∈U)的最短路徑長度(經過頂點u)比原來最短路徑長度(不經過頂點u)短,則修改頂點j的最短路徑長度

  技術分享圖片

  技術分享圖片

    頂點v到j的最短路徑=MIN(Cvk+Wkj,Cvj)

技術分享圖片

具體執行步驟如下圖所示:

S U

DIST[]

{A, B, C, D, E, F }

PATH[]

{A, B, C, D, E, F }

{A} {B, C, D, E, F} {0, 6, 3, ∞, ∞, ∞} {A, A, A, -1, -1, -1}
{A, B, C} {D, E, F } {0, 6, 3, 6, 7, ∞} {A, A, A, C, C, -1}
{A,B,C,D,E} {F} {0, 6, 3, 6, 7, 9} {A, A, A, C, C, D}
{A,B,C,D,E,F} {0} {0, 6, 3, 6, 7, 9} {A, A, A, C, C, D}

最短路徑之Dijkstra算法