最短路徑(Dijsktra演算法 Floyd演算法)

2022-02-20 05:03:11 字數 1503 閱讀 4560

1、最短路徑:

兩個結點之間,帶權路徑長度最短的路徑。

常用演算法是dijkstra演算法和floyd演算法,區別在於dijsktra演算法每次只能算出某乙個結點到其他結點的最短路徑,而floyd演算法可以直接把圖中任意兩個結點的最短路徑都算出來

最短路徑一定是簡單路徑。

2、dijkstra(迪傑斯特拉)演算法

a、利用了三個陣列

dist [  ]   表示距離源點的距離

path [  ]  記錄現在結點的上乙個結點

s [  ]  記錄該結點有沒有被訪問過

b、無論用鄰接矩陣還是鄰接表儲存,時間複雜度都為o(|v|2)

c、邊上帶有負權值時,不能使用dijkstra演算法。

d、每次都從中找未被訪問過的距離源點最近哪個結點(比如離a最近的c),然後以這個結點(c)為中心,看這個結點(c)指向哪些其他的結點(e、f),然後更新這些結點(e、f)的值(就是如果加起來的值比原來的要小,則更新,說明找到更短的路徑)。然後再從未訪問的結點中,選取離源點最近的值,重複以上操作。等到所有結點都訪問過後,最後一輪得到的就是所有其他結點到源點的最短路徑長度

e、答題的時候,一般要求把最後一輪得到的表寫下來,根據這個表可以得到源點到其他結點最短路徑長度,以及中間經過哪些結點。下圖為乙個例子:

3、floyd(弗洛依德)演算法

a、floyd演算法可以允許圖中帶有負權值的邊,但是不能有帶負權值的邊組成的迴路

b、時間複雜度是o(|v|3),因為把建立臨界矩陣需要遍歷一遍,再一次輪流把經過每乙個結點(第二遍),到達其他所有的結點(第三遍)的距離與現在的距離比較,如果更小則更新。

c、原理:

d、最終得到的表如何看最短路徑和路徑上經過的序列是多少:

下圖為例子:比如a15,就是從1結點到5結點最短距離是60,從p矩陣可以知道,經過了4結點,即1 — 4 — 5,再看1,4之間,沒有其他結點,4,5之間,又經過3結點。這樣依次找下去,就可以得到路徑。

基於Dijsktra演算法的最短路徑求解

描述 一張地圖包括 n個城市,假設城市間有 m條路徑 有向圖 每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用 dijsktra 演算法求出起點到終點之間的最短路徑。輸入多組資料,每組資料有m 3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第二行有n個字元,代表每個城市的名...

基於Dijsktra演算法的最短路徑求解

基於dijsktra演算法的最短路徑求解 描述一張地圖包括n個城市,假設城市間有m條路徑 有向圖 每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用dijsktra演算法求出起點到終點之間的最短路徑。輸入多組資料,每組資料有m 3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第...

複習之路 最短路演算法Dijsktra

dijkstra spfa floyd dijkstra演算法是一種單源最短路演算法,適用於無負權的圖。其採用了bfs 貪心的方式來更新最短路。初始化dis 每乙個點 dis 起點 0。標記起點,加入集合s。其他點不標記,加入集合u。從集合u中選取與當前點a距離最近的點b。若起點到點a的距離 點a到...