天天看點

【資料結構筆記24】單源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

本次筆記内容:

7.1.1 概述

7.1.2 無權圖的單源最短路

7.1.3 有權圖的單源最短路

7.1.3-s 有權圖的單源最短路示例

7.1.4 多源最短路算法

最短路徑問題

最短路徑問題的抽象

問題分類

無權圖的單源最短路算法

有權圖的單源最短路算法

負值圈(negative-cost cycle)

Dijkstra算法

Dijkstra時間複雜度讨論

多源最短路算法

Floyd算法

在網絡中,求兩個不同頂點之間的所有路徑中,邊的權值之和最小的那一條路徑。

這條路徑就是兩點之間的最短路徑(Shortest Path);

第一個頂點為源點(Source);

最後一個頂點為終點(Destination)。

單源最短路徑問題:從某固定源點出發,求其到所有其他頂點的最短路徑:

(有向/無向)無權圖

(有向/無向)有權圖

多源最短路徑問題:求任意兩頂點間的最短路徑

按照遞增(非遞減)的順序找出各個頂點的最短路。實際上就是廣度優先搜尋算法(BFS)。

【資料結構筆記24】單源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

dist[W] = S到W的最短距離

dist[S] = 0

path[W] = S到W的路上經過的某頂點

假設上述圖用鄰接表存儲,上述算法的時間複雜度為

T

=

O

(

V

+

E

)

T=O(|V|+|E|)

T=O(∣V∣+∣E∣)。

【資料結構筆記24】單源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

如上圖,如果存在負值圈(negative-cost cycle),則進入無限循環。是以,我們的最短路算法都不考慮存在負值圈的情況。

算法思路依舊是按照遞增(非遞減)的順序找出各個頂點的最短路。

【資料結構筆記24】單源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

這個算法不能解決有負邊的情況。

(1)直接掃描所有未收錄頂點:O(|V|)

2

T=O(|V|^2+|E|)

T=O(∣V∣2+∣E∣)

對于稠密圖效果好(E與V^2同一數量級)

(2)将dist存在最小堆中:O(log|V|)

更新dist[W]的值:O(log|V|)

l

o

g

T=O(|V|log|V|+|E|log|V|)=O(|E|log|V|)

T=O(∣V∣log∣V∣+∣E∣log∣V∣)=O(∣E∣log∣V∣)

對于稀疏圖效果好(E與V同一數量級)

Dijkstra例題我已在運籌學裡學過多次,所寫項目也有所應用,示例不再記錄了。

【資料結構筆記24】單源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

如圖是Dijkstra的例題,現在的狀态是剛剛收錄V_5,準備通路V_5的鄰接點。

方法1:直接将單源最短路算法調用|V|遍。

3

×

T=O(|V|^3+|E| \times |V|)

T=O(∣V∣3+∣E∣×∣V∣)

對稀疏圖效果好

方法2:Floyd算法

T=O(|V|^3)

T=O(∣V∣3)

對于稠密圖效果好

如上圖,D[i][j]逐漸将各個點收錄,求包含已收錄點的最短距離。

如上圖,Floyd算法的時間複雜圖是

T=O(∣V∣3)。

繼續閱讀