Floyd算法(求所有節點對的最短路徑)


Floyd算法(求所有節點對的最短路徑):

首先考慮使用單源最短路徑算法重復|V|次,這樣的復雜度會達到|V|^4,因為其中有很多重復的運算。

Floyd算法復雜度為|V|^3。

其維護一個二維數組Q,Q[i][j]表示i到j的最短路徑長度,如果不存在則為無窮大,若i==j則為0。

然后分別利用節點0、1、2、...n-1(n=|V|)來松弛所有邊。

比如最初使用節點0來松弛,即對於所有的i!=j,考察是否滿足Q[i][j]>Q[i][0]+Q[0][j],如果成立,那么就更新Q[i][j]的值為Q[i][0]+Q[0][j]。

接下來使用節點1繼續上述操作。

。。。

每個節點循環一次,每次循環中要遍歷二維數組Q中的所有節點,所以總復雜度為O(|V|^3)。

代碼:

vector<vector<int>> Floyd(vector<vector<int>>& matrix){    //輸入為鄰接矩陣
    int n=matrix.size();
    if(n==0 or n!=matrix[0].size()){
        return;
    }
    //初始化二維數組Q
    vector<vector<int>> Q(n,vector<int>(n,10000));
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            if(matrix[i][j]){
                Q[i][j]=matrix[i][j];
            }
        }
    }
    for(int i=0;i<n;++i){
        Q[i][i]=0;
    }
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            for(int k=0;k<n;++k){
                Q[j][k]=min(Q[j][k],Q[j][i]+Q[i][k]);
            }
        }
    }
    return move(Q);
}

 


免責聲明!

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



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