弗洛伊德 Floyd 演算法

2021-09-28 18:48:35 字數 1724 閱讀 8391

和dijkstra演算法一樣,弗洛伊德(floyd)演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名

弗洛伊德演算法(floyd)計算圖中各個頂點之間的最短路徑

迪傑斯特拉演算法用於計算圖中某乙個頂點到其他頂點的最短路徑。

弗洛伊德演算法 vs 迪傑斯特拉演算法:迪傑斯特拉演算法通過選定的被訪問頂點,求出從出發訪問頂點到其他頂點的最短路徑;弗洛伊德演算法中每乙個頂點都是出發訪問點,所以需要將每乙個頂點看做被訪問頂點,求出從每乙個頂點到其他頂點的最短路徑。

這個演算法相對於迪傑斯特拉演算法容易太多了,相對容易理解

弗洛伊德(floyd)演算法**分析

設定頂點vi到頂點vk的最短路徑已知為lik,頂點vk到vj的最短路徑已知為lkj,頂點vi到vj的路徑為lij,則vi到vj的最短路徑為:min((lik+lkj),lij),vk的取值為圖中所有頂點,則可獲得vi到vj的最短路徑

至於vi到vk的最短路徑lik或者vk到vj的最短路徑lkj,是以同樣的方式獲得

我們在這裡始終是對這兩個陣列進行操作的

初始化:

第一輪迴圈中,以a(下標為:0)作為中間頂點

將a作為中間頂點情況有

c-a-g [9]

c-a-b [12]

g-a-b [7]

【即把a作為中間頂點的所有情況都進行遍歷, 就會得到更新距離表 和 前驅關係】,

距離表和前驅關係更新為

**實現:

public class floydalgorithm ;

//建立鄰接矩陣

int matrix = new int[vertex.length][vertex.length];

final int n = 65535;

matrix[0] = new int ;

matrix[1] = new int ;

matrix[2] = new int ;

matrix[3] = new int ;

matrix[4] = new int ;

matrix[5] = new int ;

matrix[6] = new int ;

//建立 graph 物件

graph graph = new graph(vertex.length, matrix, vertex);

//呼叫弗洛伊德演算法

graph.floyd();

graph.show(); }}

// 建立圖

class graph }

//弗洛伊德演算法, 比較容易理解,而且容易實現

public void floyd() }}

} }// 顯示pre陣列和dis陣列

public void show()

}// 輸出dis陣列的一行資料

for (int k = 0; k < dis.length; k++)

} }}

弗洛伊德(Floyd)演算法

弗洛伊德 floyd 演算法過程 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。演算法理解 最短距離有三種情況 兩點的直達距離最短。如下圖 兩點間只通過乙個中間點而距離最短。圖 兩點間用通過兩各以上的頂點...

弗洛伊德 Floyd 演算法

佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...

弗洛伊德(Floyd)演算法入門

這個演算法其實是在基於動態規劃演算法之上 類似於01揹包 進行設想的 部分 和思路參考自最短路徑演算法 設di,j,k為從i到j的只以 1 k 集合中結點為中間結點的最短路徑的長度,那麼按照01揹包的思維就是1.從頂點i到頂點j是不經過k的,那麼就是dijk 1,2.如果確實經過k的話,就把兩個頂點...