弗洛伊德(Floyd)演算法詳解

2021-10-07 22:12:25 字數 1340 閱讀 5804

每個頂點a[i][j],都對 i,j 進行中間點k連線, a[i][j] = min,並修改對應的路徑長度

直到所有經過k頂點的所有路徑都比較完畢,在處理完k頂點的基礎上得到對應a,path,再處理 其他 經過頂點

以此類推得到所有頂點對之間的最短路徑長度與最短路徑

/*

弗洛伊德演算法

*/#include #define maxv 7 //最大頂點個數

#define maxedges 12 //最大邊數

#define infinity 65535 //無窮大

typedef int infotype;

typedef struct

vertextype; //頂點型別

typedef struct

mgraph; //完整的圖鄰接矩陣

void dispath(mgraph g, int a[maxv], int path[maxv])

d++;

apath[d] = i; //新增起點

printf(" %d", apath[d]);

for (int s = d - 1; s >= 0; s--)

printf(" 路徑長度為:%d\n", a[i][j]);}}

}}/*

a[i][j]存放頂點i 到j的當前最短路徑長度;

path用於推到導所有頂點之間的最短路徑,第i行表示 頂點i到其他頂點的最短路徑,如path[i][j]存放頂點j的前驅頂點

思想:初始化原鄰接矩陣,每個頂點a[i][j],都對 i,j 進行中間點k連線, a[i][j] = min,並修改對應的路徑長度

直到所有經過k頂點的所有路徑都比較完畢,在處理完k頂點的基礎上得到對應a,path,再處理 其他 經過頂點

以此類推得到所有頂點對之間的最短路徑長度與最短路徑

*/void floyd(mgraph g)

else}}

for (k = 0; k < g.numvertex; k++)}}

}dispath(g, a, path); //輸出最短路徑

}int main(void)

, , , , , , };

g.numvertex = 7;

g.numedges = 12;

for (int i = 0; i < g.numvertex; i++)

}floyd(g);

getchar();

getchar();

return 0;

}

弗洛伊德(Floyd)演算法

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

弗洛伊德 Floyd 演算法

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

弗洛伊德 Floyd 演算法

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