Floyd多源最短路

2022-02-28 17:12:36 字數 913 閱讀 1112

可以對每乙個頂點使用dijkstra演算法求多源最短路。

這裡我們來介紹另一種解法:floyd

floyd演算法的主要思想是迭代。每次迭代會朝著答案更近一步。

首先定義乙個二維陣列dk[i][j](k初始等於0)

.這個二維陣列代表從i到j的最短距離。

floyd更適合解決稠密圖,所以我們使用鄰接矩陣來表示圖。

初始化:

如果i,j有路 

d0[i][j] = g[i][j] (g為我們的鄰接矩陣)

否則 d0[i][j] = inf(正無窮大)

(1)我們加入乙個頂點,這個點的加入可能會影響到某兩個點之間的最短路。所以檢查任意i到k, k到j之間的距離。

如果 dk-1[i][k] +  dk-1[k][j]  < dk[i][j]

更新 :dk[i][j] = dk-1[i][k] +  dk-1[k][j]

(2)迴圈加入每乙個頂點,直到所以頂點都被加入,floyd結束。

(如果我們想得到兩個點之間的路徑, 在執行演算法的同時記錄path[i][j])

#define maxvertexnum 100000typedef 

intvertex;

typedef

struct

node

node;

typedef

struct

mygraph

mygraph;

void floyd(mygraph& g, int

d, vertex path)

}//迭代

for(vertex k = 0; k < g.v; k++)

}

}

} }

多源最短路(floyd)

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

多源最短路 Floyd演算法

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

多源最短路演算法 Floyd演算法

我們知道單源最短路是指從某乙個源點到圖中的其它頂點的最短路。多源最短路就是指每乙個點到圖中其他頂點的最短路。那麼有的人肯定想我知道求單源最短路的演算法了,那麼有多少個點我就求多少次唄,這樣做時間效率不高,空間效率也極其低。那麼有什麼演算法求解多源最短路呢?floyd 鄰接矩陣存圖 int dp n ...