最短路徑:Dijkstra算法和Floyd算法
時間 2021-07-10
標籤
數據結構
算法
圖論
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。
由上表可知:
- 頂點v0到頂點v1的最短路徑爲v0→v1,長度爲10.
- 頂點v0到頂點v2的最短路徑爲v0→v3→v2,長度爲50.
- 頂點v0到頂點v3的最短路徑爲v0→v3,長度爲30.
- 頂點v0到頂點v4的最短路徑爲v0→v3→v2→v4,長度爲60.
Floyd算法——多源最短路徑算法
算法本質:求圖中任意一對頂點間的最短路徑。
相關符號 |
說明 |
w<vi, vj> |
從頂點 vi 到頂點 vj 的權值 |
distk(vi, vj) |
從頂點 vi 到頂點 vj 經過的頂點編號不大於 k 的最短路徑長度 |
每一對頂點的最短路徑
- 初始化:假設從 vi 到 vj 的弧是最短路徑,即dist-1(vi, vj)=w<vi, vj>;
- 循環變量 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