請不要輕易點選標題
乙個適用於求可含負邊權的稀疏圖的多源最短路演算法
時間複雜度\(o(n \cdot m \cdot log \ m+n \cdot m)\)
空間複雜度\(o(n+m)\)
該演算法綜合利用了dijkstra演算法和bellman-ford演算法(不要慌,雖然有負邊但dijkstra可以跑!)
在開始講解之前,我們將其與floyd演算法進行比較
時間複雜度\(o(n^3+m)\)
空間複雜度\(o(n^2)\)
可以看出,\(\text\)複雜度與\(m\)無關 , 適用於稠密圖的最短路,而\(johnson\)演算法則是適用於稀疏圖最短路
\[\
\]我對該演算法的理解
限制條件:沒有負環即可
在有負權邊的圖上,\(dijkstra\)的轉移受到限制,我們需要進行一定處理
核心 : 將邊權\(reweight\),保證邊權非負後,即可跑\(n\)遍\(dijkstra\),複雜度穩定\(n \cdot m \cdot log \ m\)(相較於spfa來說穩定很多)
\[\
\]reweight過程
1.建立超級源點0號節點,向\(1 - n\)號節點建立邊權為0的有向邊
2.利用bellman-ford(或spfa)求得\(dis[0][1..n]\)
3.將邊\((u,v,w)\)的邊權\(w\)加上\(dis[0][u]-dis[0][v]\),使得邊權非負
4.在非負邊權的圖上,使用\(n\)次堆優化dijkstra求得最短路
5.將\(dis[u][v]\)加上\(dis[0][v]-dis[0][u]\)還原
\[\
\]關於reweight的正確性
1.邊權非負性:根據三角不等式\(dis[v]\leq dis[u]+w\),移項得到\(w+dis[u]-dis[v] \ge 0\),故reweight後邊權非負
2.最短路的保留:對於一條最短路\(\lbrace p_1,p_2,..,p_k\rbrace\),reweight後更改的權值即\(dis[p1]-dis[p2]+dis[p2]-dis[p3]...-dis[p_k]\)
即\(dis[0][v]-dis[0][u]\),兩點間最短路只會有常數修改,因此對於任意兩點保留了最短路
所以我們可以直接用這個演算法解決一些特殊的問題
當然這個也被應用於優化費用流,即dijkstra費用流
Johnson全源最短路
例題 p5905 模板 johnson 全源最短路 首先考慮求全源最短路的幾種方法 好像 只有dijkstra還有希望?但負權邊處理不了真是很棘手啊。一種方法是讓每條邊都加上乙個數 x 使得邊權為正,但考慮下圖 1 到 2 的最短路應為 1 3 4 2 長度為 1 如果我們把每條邊的邊權都加上 5 ...
johnson全源最短路
一下都假設該有向圖 無向圖同理 有n個點,m條邊。談及全源最短路,第乙個想到的是弗洛伊德演算法,簡單有效,因為並非本篇文章重點,所以只是把 放在這裡 int main 唯一要注意的就是必須要列舉轉折點。時間複雜度o n 3 當n很大時不是乙個可以接受的數字。或者跑n遍單元最短路。你可以用spfa跑,...
最短路 Johnson 演算法
這個演算法可以用於處理稀疏圖,帶有負權的任意兩點間的最短路問題 如果點數 但是dij中不能存在負的邊權,所以我們要考慮一種轉化邊權的方法 可以通過類似差分約束的方法來重構邊權 對一條邊 u,v 他們的權值為e dis i 表示1 i的最短路 我們可以得到dis v dis u e 因此就可以把變成d...