Dijkstra 是求某個頂點到其余各個頂點的最短路徑。
Floyd 是求圖中任意一對頂點間的最短路徑。
過程
假設存在有向圖,

采用的存儲結構是 鄰接矩陣

首先初始化 A[ ][ ] 方陣,

path[ ][ ] 方陣默認值為 -1
A 的下標代表第幾個節點,-1 代表初始化節點
// 初始化
for (i = 0; i < g.n; i++) {
for (j = 0; j < g.n; j++) {
A[i][j] = g.edges[i][j];
path[i][j] = -1;
}
}

按照節點順序依次遍歷 k = 0 時
首先選擇第一個, 以A[0[0]為基准做十字交叉線 X1,類比矩陣的余子式;除了此十字線以外的數字,
選擇一個 A[i][j] 再做一個十字交叉 X2,與 X1 相交於兩點 A[i][0]、A[0][j],判斷:
if (A[i][j] > A[i][0] + A[0][j]){
A[i][j] = A[i][0] + A[0][j]
path[i][j] = k; // 同時修改path, k此時為0
}
從上到下、從左到右依次對比 <=> 所有相鄰的邊
注意:如果A[i][j] 在以 A[0][0] 為基准的十字線上,就不需要進行比較。
方陣A 比較完后沒有數字修改

k = 1 時,
以 A[1][1] 為為基准做十字交叉線,比對過程和上述一樣。
只有 A[0][2] 修改條件成立,故 path[0][2] = k

同理 k = 2 時,從上至下、從左至右遍歷,除了十字線上的
修改A[1][0]、A[3][0]、A[3][1]的值
對應path[1][0] = k、path[3][0] = k、path[3][1] = k

k = 3 時,,從上至下、從左至右遍歷,除了十字線上的
修改A[0][2]、A[1][0]、A[1][2]
對應path[0][2] = k、path[1][0] = k、path[1][2] = k

遍歷結束。
以對上過程歸納可得天勤代碼。
代碼
void Floyd(MGraph * g, int &path[][maxsize], int A[][maxsize] ) {
// 初始化
for (i = 0; i < g.n; i++) {
for (j = 0; j < g.n; j++) {
A[i][j] = g.edges[i][j];
path[i][j] = -1;
}
}
for (k = 0; k < g.n; k++) { // 對節點遍歷
for (i = 0; i < g.n; i++) { // 對方陣里的值枚舉
for (j = 0; j < g.n; j++) {
if( A[i][j] > A[i][k] + A[k][j] ) { // 修改條件
A[i][j] = A[i][k] + A[k][j];
path[][] = k;
}
}
}
}
}
