一,最短路徑問題抽象
典型用途: 交通網絡問題(從甲地到乙地是否有公路連通?哪一條路是最短的?)
交通網絡用有向網來表示:
- 頂點 — 表示地點;
- 弧 — 表示兩個地點之間有路連通;
- 弧上的權值 — 表示兩地之間的距離、交通費或途中所花費的時間等。
如何能夠使運輸時間最短或運費最少?這就是一個求兩個地點間的最短路徑問題。
問題抽象: 在有向網中 A 點(源點)到達 B 點(終點)的多條路徑中,尋找一條各邊權值之和最小的路徑,即最短路徑。
!!!注意!!!
最短路徑與最小生成樹不同,
路徑上不一定包含 n 個頂點,
也不一定包含 n-1 條邊。
1.1 單源(兩點之間)最短路徑 - Dijkstra算法
視頻講解:6.6.2最短路徑2–Dijkstra算法
ps:有時間的話建議看一下上邊的視頻講解。
單源最短路徑(Single-Source Shortest Paths) — 使用 Dijkstra(地傑斯特拉)算法
步驟總結:
- 選擇起始點,分別記錄該點到所有與其鄰接的(直達)頂點的距離,並選擇距離最短段的頂點作爲轉接點,即爲 vj;
- 將 vj 加入路徑,並記錄加入該點後可以到達的頂點和距離,並選出最短距離,並記錄到達的點爲下一個轉接點;
- 重複上述操作,直至訪問過所有的頂點。
1.2 某源點到其他各點的最短路徑 - Floyd算法
視頻參考:6.6.2最短路徑3–Floyd算法
所有頂點間的最短路徑
- 方法1:依次以所有頂點爲源點,重複執行
Dijkstra算法 n 次
; - 方法2:使用
Floyd(弗洛伊德)算法
。
Floyd(弗洛伊德)算法思想
- 逐個頂點試探;
- 從 vi 到 vj 的所有可能存在的路徑中;
- 選出一條長度最短的路徑。
例,採用Floyd算法,求圖中各項頂點之間最短路徑