最短路徑之Dijkstra算法
阿新 • • 發佈:2018-04-15
最優解 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算法