1. 程式人生 > >【圖】最短路徑:迪傑斯特拉(Dijkstra)演算法

【圖】最短路徑:迪傑斯特拉(Dijkstra)演算法

網圖和非網圖中,最短路徑的含義不同:

  • 非網圖中,因為沒有邊上的權值,最短路徑指的是兩頂點之間經過的邊數最少的路徑;
  • 網圖中,最短路徑指的是兩頂點之間經過的邊上權值之和最少的路徑,並且稱路徑上的第一個頂點是源點,最後一個頂點是終點。

迪傑斯特拉(Dijkstra)演算法

定義

Dijkstra(迪傑斯特拉)演算法是單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。

特點

以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

基本思想

假設 G=(V,{E}) 是一個帶權有向圖,把圖中頂點集合 V 分成兩組,

  • 第一組為已求出最短路徑的頂點集合 S
    及其路徑長度(初始時 S 中只有一個源點,以後每求得一條最短路徑 , 就加入到集合 S 中,直到全部頂點都加入到 S 中)
  • 第二組為未確定最短路徑的頂點集合 U 及其路徑長度,按最短路徑長度遞增次序依次把 U 中的點加入 S 中。在加入的過程中,總保持從源點 vS 中各頂點的最短路徑長度不大於從源點 vU 中任何頂點的最短路徑長度。

此外,每個點對應一個距離,S 中點的路徑長度就是從 v 到這個點的最短路徑長度,U 中的點的路徑長度,是從 v 到這個點由 S 中的頂點作為中間頂點的當前最短路徑長度。

迪杰特斯拉演算法不是一下子求出源點到其餘各點的最短路徑,而是一步步求出它們之間頂點的最短路徑,過程中都是基於已經求出的最短路徑的基礎上,求得更遠頂點的最短路徑,最終得到結果。

演算法步驟

  1. 初始時,S 只包含源點,即 S{v}v 的距離為 0。U 包含除 v 外的其他頂點,即:U={},若 vU 中頂點 u 有邊,則 <u,v> 正常有權值,若 u 不是 v 的鄰接點,則 <u,v> 權值為
  2. U 中選取一個距離 v 最小的頂點 k,把 k加入 S 中(該選定的距離就是 vk 的最短路徑長度)。
  3. k 為新考慮的中間點,修改 U 中各頂點的距離;若從源點v 到頂點 u 的距離(經過頂點 k)比原來距離(不經過頂點k)短,則修改頂點 u 的距離值,修改後的距離值的頂點 k 的距離加上邊上的權。
  4. 重複步驟 2 和 3 直到所有頂點都包含在 S
    中。

演算法例項

給出一個無向圖:
這裡寫圖片描述
用Dijkstra演算法找出以 v0 為起點的單源最短路徑步驟如下:
這裡寫圖片描述