模板 Floyd多源最短路 P2910

2022-06-25 01:36:09 字數 1079 閱讀 3825

參考此文

floyd利用動態規劃暴力計算多源點間最短路.

通過列舉"中轉站",並列舉所有可行的起點和終點,檢查通過此中轉站能否得到此起點終點的更短路徑.o(n3).

由於其複雜度較大(因而只能處理小資料)且需要同時檢查中轉站的父節點和子節點,適合用鄰接矩陣處理.

(帶權圖,邊權可正可負,不存在的路徑初始化為inf)

for (int k = 1; k <= n; ++k) //

中轉站for (int i = 1; i <= n; ++i) //

起點if (i !=k)

for (int j = 1; j <= n; ++j) //

終點if (i != j && j !=k)

dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);

進行floyd處理後,dist[i][j]即表示節點 i 到節點 j 的最短距離.

為什麼要把中轉站放在最外層呢?看看別人的部落格:

(圖即鏈結)

不能處理有負權迴路的圖.

這裡的每乙個節點到任意乙個其他節點都是有一條有向邊的,存圖和算距離可以在同乙個陣列中操作.

只需floyd先算出任意兩點間的最短路,再累加給定的序列中相鄰兩點的最短路即可.

#include #include 

#include

#include

using

namespace

std;

int n, m, dist[110][110], s[10010

];int

main()

p2910

多源最短路(floyd)

floyd 就是很簡單很簡單的一種dp 3個for迴圈就出結果 看 就可以知道,floyd就是通過遍歷可能會出現i j比i k k j大的情況,很簡單。貼乙個水題 floyd考的話也是和其他演算法一起考 一般情況下由於floyd的本質,n方的鄰接鍊錶矩陣反而更有效率。include using na...

Floyd多源最短路

可以對每乙個頂點使用dijkstra演算法求多源最短路。這裡我們來介紹另一種解法 floyd floyd演算法的主要思想是迭代。每次迭代會朝著答案更近一步。首先定義乙個二維陣列dk i j k初始等於0 這個二維陣列代表從i到j的最短距離。floyd更適合解決稠密圖,所以我們使用鄰接矩陣來表示圖。初...

多源最短路 Floyd演算法

問題的提出 已知乙個有向網 或者無向網 對每一對定點vi vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。解決該問題有以下兩種方法 1 輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...