弗洛伊德 Floyd 演算法

2022-09-18 10:51:28 字數 1097 閱讀 7098

佛羅依德(floyd )演算法的基本思想:

設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。

(-1)將vi到vj的最短的路徑長度初始化為g.arcs[i][j].adj,進行如下n次比較和修正:

(0)在vi與vj間加入頂點v0,比較(vi, v0, vj )和(vi, vj)的路徑的長度,取其中較短的路徑作為vi到vj的且中間頂點編號不大於0的最短路徑。

(1)在vi與vj間加入頂點v1,得(vi,…, v1 )和(v1,…, vj),其中(vi,…, v1)是vi到v1間中間頂點編號不大於0的最短路徑,(v1,…, vj)是v1到vj的且中間頂點編號不大於0的最短路徑,這兩條路徑在上一步中均已求出。將(vi,…, v1,…, vj )與上一步已求出的vi到vj中間頂點號不大於0的最短路徑比較,取其中較短的路徑作為vi到vj的中間頂點號不大於1的最短路徑。

(2)在vi與vj間加入頂點v2,得(vi,…,v2)和(v2,…, vj ),其中(vi,…,v2)是vi到v2 的中間頂點號不大於1的最短路徑,(v2,…, vj) 是v2到vj的中間頂點號不大於1的最短路徑,這兩條路徑在上一步中已求出。將(vi,…,v2,…,vj)與上一步已求出的vi到vj中間頂點號不大於1的最短路徑比較,取其中較短的路徑作為vi到vj的中間頂點號不大於2的最短路徑。

… 依次類推,經過n次比較和修正,在第(n-1)步,將求得vi到vj的且中間頂點號不大於n-1的最短路徑,必為從vi到vj的最短路徑。

typedef seqlist vertexset;

shortestpath_floyd(adjmartrix g,

weighttype dist[max_vertex_num][max_vertex_num]),

vertexset path[max_vertex_num][max_vertex_num]) }}

for(k = 0; k < g.vexnum; k++) //end if joinlist合併順序表操作

} //end for(j)

} //end for(i)

} //end for(k)

}

知乎:solo | 微博@從流域到海域

弗洛伊德(Floyd)演算法

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

弗洛伊德 Floyd 演算法

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

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

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