最短路徑:Dijkstra算法和Floyd算法

Dijkstra算法——單源最短路徑算法

算法本質:求圖中某個頂點到其餘各頂點的最短路徑。

相關符號 說明
v 源點
S 已經生成最短路徑的終點
w<v, vi> 從頂點 v 到頂點 vi 的權值
dist(v, vi) 表示從頂點 v 到頂點 vi 的最短路徑長度
數組dist[n] 存儲當前最短路徑的長度
數組path[n] 存儲當前的最短路徑,即頂點序列

從 v 到其他所有頂點的最短路徑

  • 初始化:集合S = {v};dist(v, vi) = w<v, vi>, (i=1…n);
  • 重複下述操作直到 S == V
    2.1 dist(v, vk) = min{dist(v, vj), (j=1…n)};
    2.2 S = S + {vk};
    2.3 dist(v, vj)=min{dist(v, vj), dist(v, vk) + w<vk, vj>};

例:
在這裏插入圖片描述
圖採用鄰接矩陣來存儲
在這裏插入圖片描述

  • (1)從頂點v0到其餘頂點最短路徑。當v0到vi有邊,則寫出權值,否則∞。

在這裏插入圖片描述
在這裏插入圖片描述

  • (2) 從通往當前剩餘頂點的路徑選取權值最小的,是v0->v1.權值爲10,因此將頂點v1併入到S中。

在這裏插入圖片描述
在這裏插入圖片描述

  • (3)從通往當前剩餘頂點的路徑中選取權值最小的,是v0->v3,權值爲30,因此將v3併入到S中。
    v0->v3->v2,權值爲50,將v2併入到S。

在這裏插入圖片描述

  • 重複上述操作

在這裏插入圖片描述
在這裏插入圖片描述
由上表可知:

  1. 頂點v0到頂點v1的最短路徑爲v0→v1,長度爲10.
  2. 頂點v0到頂點v2的最短路徑爲v0→v3→v2,長度爲50.
  3. 頂點v0到頂點v3的最短路徑爲v0→v3,長度爲30.
  4. 頂點v0到頂點v4的最短路徑爲v0→v3→v2→v4,長度爲60.

Floyd算法——多源最短路徑算法

算法本質:求圖中任意一對頂點間的最短路徑。

相關符號 說明
w<vi, vj> 從頂點 vi 到頂點 vj 的權值
distk(vi, vj) 從頂點 vi 到頂點 vj 經過的頂點編號不大於 k 的最短路徑長度

每一對頂點的最短路徑

  1. 初始化:假設從 vi 到 vj 的弧是最短路徑,即dist-1(vi, vj)=w<vi, vj>;
  2. 循環變量 k 從 0~n-1 進行 n 次迭代:
    distk(vi, vj)=min{distk-1(vi, vj), distk-1(vi, vk)+distk-1(vk, vj)}

例:有三座城市,v0與v2、v1城市有互相到達的公路,v2沒有直接到達v1的公路。
在這裏插入圖片描述
城市v2去城市v1經過了城市v0,距離爲7。
在這裏插入圖片描述
城市v0去城市v2可以經過了城市v1,距離爲6<直接去的距離11.
在這裏插入圖片描述
城市v1去城市v0可以經過了城市v2,距離爲5<直接去的距離6.
在這裏插入圖片描述

時間複雜度

最短路徑算法 時間複雜度
Dijkstra算法 O(n²)
Floyd算法 O(n³)

此次的數據結構分享就到這裏,歡迎大家指導指正~ 我是愛吃肉的小白yyyloki,如果你覺得不錯的話點個贊👍吧!我們下次見~886

在這裏插入圖片描述