跳至內容

最短路問題

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
一個有6個節點和7條邊的圖

最短路徑問題是圖論研究中的一個經典算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。算法具體的形式包括:

  • 確定起點的最短路徑問題 - 也叫單源最短路問題,即已知起始結點,求最短路徑的問題。在邊權非負時適合使用Dijkstra算法,若邊權為負時則適合使用Bellman-ford算法或者SPFA算法
  • 確定終點的最短路徑問題 - 與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。
  • 確定起點終點的最短路徑問題 - 即已知起點和終點,求兩結點之間的最短路徑。
  • 全局最短路徑問題 - 也叫多源最短路問題,求圖中所有的最短路徑。適合使用Floyd-Warshall算法

用於解決最短路徑問題的算法被稱做「最短路徑算法」,有時被簡稱作「路徑算法」。最常用的路徑算法有:

單源最短路徑算法

[編輯]

無向圖

[編輯]
權值要求 時間複雜度 作者
+ Dijkstra 1959
+ Johnson 1977 (二叉堆)
+ Fredman & Tarjan 1984 (斐波那契堆)
Thorup 1999 (要求常數時間複雜度的乘法)。

無權圖

[編輯]
算法 時間複雜度 作者
廣度優先搜索 Konrad Zuse 1945,Moore 1959

有向無環圖

[編輯]

使用拓撲排序算法可以在有權值的DAG中以線性時間()求解單源最短路徑問題。

無負權的有向圖

[編輯]

假設邊緣權重均為整數。

算法 時間複雜度 作者
O(V 2EL) Ford 1956
Bellman–Ford 算法 O(VE) Shimbel 1955, Bellman 1958, Moore 1959
O(V 2 log V) Dantzig 1960
Dijkstra's 算法(列表) O(V 2) Leyzorek et al. 1957, Dijkstra 1959, Minty (see Pollack & Wiebenson 1960), Whiting & Hillier 1960
Dijkstra's 算法(二叉堆) O((E + V) log V) Johnson 1977
…… …… ……
Dijkstra's 算法(斐波那契堆) O(E + V log V) Fredman & Tarjan 1984, Fredman & Tarjan 1987
O(E log log L) Johnson 1981, Karlsson & Poblete 1983
Gabow's 算法 O(E logE/V L) Gabow 1983, Gabow 1985
Ahuja et al. 1990
Thorup O(E + V log log V) Thorup 2004


參見

[編輯]