演算法的思想:
遍歷每個結點。然後以這個結點為中間結點來更新所有的結點。
edge(i,j) = min( edge( i , k ) + edge( k , j ) , edge( i , j ) )
edge就是邊的長度
例如:
image.png
首先 以 1 為中間結點,更新(1,2),(1,3)(1,4)(1,5)(1,6)(2,3)(2,4)……等所有結點
其次,在以2為中間結點,更新(1,2),(1,3)(1,4)(1,5)(1,6)(2,3)(2,4)……等所有結點
再者,在以3為中間結點,更新(1,2),(1,3)(1,4)(1,5)(1,6)(2,3)(2,4)……等所有結點
以至於後面所有的結點。
**在這裡需要用到乙個陣列來記錄前繼結點。 **
這個演算法的主要形式就是三層迴圈。從外到內在這裡依次為一,二,三,層迴圈。
第一層迴圈是中間結點。
第二層迴圈0是起始結點
第三層迴圈是結束結點。
需要定義乙個path陣列。初始化為每對結點的終止結點,例如(i,j)那就在i,j對應的path陣列中對應的值為j。
初始化path陣列如下:
三層迴圈如下:
**如下;
//
// main.cpp
// floyd
//// created by 橘子和香蕉 on 2018/12/15.
///*
1:求各個頂點之間的最短路徑 時間複雜度是n*3
2:從圖的鄰接矩陣出發,
還是和之前的演算法一樣,找乙個中間結點來更新所有的結點。假如 v到 u最短距離,還有幾個結點,比如是m,n,b
遍歷這個結點,比如現在用m來更新所有的結點,看距離是不是短的,要是比之前短,就更新,否則,就不要更新,
就是。d(u,v) = min(d(u,v),d(u,m)+d(m,v))
這個演算法三層迴圈,中間結點在最外面的一層。因為這樣的才可以以他為中心,來遍歷所有的結點
*/#include using namespace std;
#define vertexnum 100
#define int_max 9999
class graph;
void graph::printgraph()
void graph::create()
char start ,end;
int wieght = -1;
for (int j = 0; j>start>>end>>wieght;
int startposition = locate(start);
int endposition = locate(end);
edge[startposition][endposition] = wieght;
edge[endposition][startposition] = wieght;
}}void graph:: initedge(){
for (int i = 0; i\t";
k = path[i][j];
cout
那怎麼輸出呢?
如下所示:
測試的時候是上面的圖。
例如要查詢 1 到 2 的對應的最短路徑
先去查詢path陣列中,1 ,2 對應的值,結果是4,這就說明4是第乙個中間結點,繼續查詢 path 中,4,2對應的項,發現是3,這就說明3是 2 到4 的中間結點。也就是1 到 2 的第二個中間結點,繼續查詢3 到 2 在path對應的項,發現是2,這就說明沒有中間結點了。
輸出**如下:
這裡的圖的無向帶權圖,**執行結果如下;
資料結構 考研 Floyd演算法
floyed 演算法與 dijkstra 演算法的思想完全一樣,遍歷整個鄰接矩陣,比較每一條邊可否加入迴圈中的兩邊之間來短接。floyed 演算法基於動態規劃演算法,可以允許有負權值,但不可以有帶負權值的邊存在。首先,初始化乙個鄰接矩陣,初始化乙個 dp 矩陣,初始化乙個頂點的前趨矩陣prev。de...
資料結構 Floyd
這個演算法比較好理解。include define maxvex 10 define infinity 655535 typedef struct graphtype int located graphtype g,char v0 void create graphtype g void floyd...
資料結構 Floyd演算法 順序儲存
include include structure.c define maxvertex 100 typedef char dis 輸出floyd中的矩陣 void printdis floyd amgraph g,int a maxvertex maxvertex printf n void pr...