我們知道單源最短路是指從某乙個源點到圖中的其它頂點的最短路。
多源最短路就是指每乙個點到圖中其他頂點的最短路。
那麼有的人肯定想我知道求單源最短路的演算法了,那麼有多少個點我就求多少次唄,這樣做時間效率不高,空間效率也極其低。
那麼有什麼演算法求解多源最短路呢?——floyd
// 鄰接矩陣存圖
int dp[n]
[n][n]
;void
floyd
(int n)
else}}
}}這樣太浪費空間了把。
怎麼確定狀態轉移的?
看下圖
我們發現從頂點1到頂點4有三條路徑
dp[0][1][4]就相當於圖中的g[1][4]這裡採用鄰接矩陣的形式
然後k作為中介點可以使2,3
那麼dp[2][1][4] = dp[2][1][2] + dp[2][2][4]
也就是我們可以簡化為dp[1][4] = dp[1][2] + dp[2][4]
v1到v4等於v1到v2加上v2到v4,可以理解吧。
然後v1到v4還可以等於v1到v3加上v3到v4
即最後的最短路就是dp[1][4] = min(g[1][4], min(g[1][2] + g[2][4]
, g[1][3] + g[3][4]))
優化空間後的code
int g[n]
[n];
void
floyd
(int n)}}
}
多源最短路 Floyd演算法
問題的提出 已知乙個有向網 或者無向網 對每一對定點vi vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。解決該問題有以下兩種方法 1 輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...
Floyd演算法 多源最短路徑
解決稠密圖較好 準備工作 include floyd演算法解決稠密圖時更好 include include include using namespace std const int maxv 100 定義邊 typedef struct enode edge 定義鄰接矩陣儲存的圖 typedef ...
演算法整理 Floyd 多源最短路
首先,個人感覺起來,在四大最短路演算法中,floyd是最簡單的,也是最好理解的,但是嚴重受時間和空間的限制。存圖方式為二維陣列。複雜度 t o n 3 m o n 2 思路 o 1 核心思想 主題部分通過三個for迴圈 分別代表中點,起始點,目標點 通過每局來進行鬆弛操作,不斷更新兩點之間的最短路徑...