這裡只總結兩種最短路演算法,第一是:dijkstra,第二是:spfa;
這兩種演算法都用了佇列優化,dijkstra是優先佇列,spfa是普通佇列;
dijkstra
先介紹第一種,也是用的最多的一種最短路演算法:dijkstra;
這種演算法的思想就是先根據給定的起點 s ,找到這個點 s 所能連的點,更新一下所能連到的點的路徑,然後放入優先佇列裡面;優先佇列維護兩個東西,乙個是起點 s 到這個點的路徑權值,乙個是這個點的標號;
這裡重點要說的是對於負權邊的處理,對於負權邊,dijkstra是沒法處理的,
比如:1–2 權值為1
2–3 權值為-3
3–1 權值為2
根據dijkstra的每個點只遍歷一遍,所以1–2的最短路是1,而不是-1;當然保證最短路每條邊只走一次;
dijkstra模板:
struct nodeedge[m*2]
;void
add(
int p,
int q,
int w)
struct node};
void
dij(ll *dis,
int st));
while
(!qu.
empty()
));}
}}}
spfa
這裡先說一下,除非有負權邊和負環要用spfa,其他一概不用它;
這個演算法和 dijkstra 的區別還是挺大的:
queue而不是priority_queue;
當乙個點出隊時,要擦掉它的標記,保證它可以被再次遍歷到;
統計每個點的遍歷次數,如果大於等於 n 次,說明有負環;
這裡不在深入解釋這個演算法:
struct nodeedge[n]
;void
add(
int p,
int q,
int w)
bool
spfa()
}}return
false
;}
最短路演算法總結
1.floyd演算法 n 3複雜度 基本思想 開始設集合s的初始狀態為空,然後依次將0,1,n 1定點加入,同時用d i j 儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d i j a i j 中間不經過任何節點,然後依次向s中插入節點,並進行如下更新 d k i j min 還可以使用乙...
最短路演算法總結
藉著usaco 3.26搞了幾天最短路。不得不說usaco真是菜鳥學習演算法的利器啊,有資料可以查錯。題上是乙個800 800的稀疏圖,需要求全源最短路 先用floyd試了一下。畢竟就三行,很好寫。時間o n3 裸交第九個點果然tle了,不過看題解有人水過了 就把邏輯語言改了一下,無向圖時間又可以優...
最短路演算法總結
dijkstra演算法 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。最常見的問題就是 給你一張地圖,讓你求出指定的點到其餘各定點的最短路徑。演算法核心 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終的到源點到其餘所有點...