Floyd算法求最短路徑

                                                             Floyd算法

算法思想

通過一個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。

算法過程

1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權爲無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[i][j]=d,d表示該路的長度;否則G[i][j]=無窮大。定義一個矩陣D用來記錄所插入點的信息,D[i][j]表示從Vi到Vj需要經過的點,初始化D[i][j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值變小,則D[i][j]=k。在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑爲{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。
例如:
求從1開始到最後一個數5的最短路徑:

輸入數據:

5 7
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
1 5
輸出數據:
1->4->3->5
60


輸出數據:
1->
60

  • 算法實現

#include<iostream>
using namespace std;
#define max 1000000000
int d[1000][1000]; //記錄兩點最短距離
int path[1000][1000]; //記錄最短路徑的信息 ,可去掉 
int main() {
    int m, n, x, y, z;
    cin>> n>> m;
    for(int i= 1; i<= n; i++) {
        for(int j= 1; j<= n; j++) {
            d[i][j]= max;
            path[i][j]= j;
        }
    }
    for(int i= 1; i<= m; i++) {
        cin>> x>> y>> z;
    	d[x][y]= z;
    	d[y][x]= z;
    }
    for(int k= 1; k<= n; k++) {
        for(int i= 1; i<= n; i++) {
            for(int j= 1; j<= n; j++) {
                if(d[i][k]+ d[k][j]< d[i][j]) {
                    d[i][j]= d[i][k]+ d[k][j];  //更新最短路徑 
                    path[i][j]= path[i][k];
                }
            }
        }
    }
    int f, e;
    cin>> f>> e;
    int temp= f;
    while (temp!= e) {
        cout<< temp<< "->";
        temp= path[temp][e];
    }
    cout<< e<< endl;
    cout<< d[f][e]<< endl;
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章