Floyd 最短路徑算法(天勤詳解)


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;
                }
            }
        }
    }
    
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM