使用Dijkstra/Floyd算法解決最短路徑問題

一,最短路徑問題抽象

典型用途: 交通網絡問題(從甲地到乙地是否有公路連通?哪一條路是最短的?)

交通網絡用有向網來表示:

  • 頂點 — 表示地點;
  • — 表示兩個地點之間有路連通;
  • 弧上的權值 — 表示兩地之間的距離、交通費或途中所花費的時間等。

如何能夠使運輸時間最短或運費最少?這就是一個求兩個地點間的最短路徑問題

問題抽象:有向網中 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算法,求圖中各項頂點之間最短路徑
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章