弗洛伊德(Floyd)算法是 Robert W. Floyd(羅伯特·弗洛伊德)於 1962 年發表在「Communications of the ACM」上,Robert W.Floyd 在 1978 年得到了圖靈獎。用於從給定的加權圖中查找全部頂點間的最短路徑問題。做爲該算法的結果,它將生成矩陣,該矩陣將表示從任何頂點到圖中全部其餘頂點的最小距離。java
1.根據輸入圖的二維數組初始化輸出 dist 二維數組。
2.利用中間頂點,逐個挑選全部頂點並更新全部最短路徑。
3.選擇頂點 k 做爲中間頂點時,咱們將頂點 {0,1,2,... k-1} 視爲中間頂點,i、j 表示源頂點和目標頂點。
4.若是 k 不是從 i 到 j 的最短路徑中的中間頂點,咱們保持 dist [i] [j]的值不變。
5.若是 k 是從 i 到 j 的最短路徑中的中間頂點,而且 dist[i][k] + dist[k][j] < dist[i][j],則更新 dist[i][j] = dist[i][k] + dist[k][j]。算法
因爲弗洛伊德算法使用了三層循環,因此它的時間複雜度爲 ,空間複雜度爲
。數組
public int[][] floydWarshall(int graph[][]) {
//頂點個數
int n = 4;
int dist[][] = new int[n][n];
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
dist[i][j] = graph[i][j];
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
return dist;
}
複製代碼
弗洛伊德算法的優勢是容易理解,能夠算出任意兩個頂點之間的最短距離,代碼編寫簡單。微信
缺點是時間複雜度比較高,不適合計算大量數據。spa
PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。code