全源最短路徑演算法 Floyd

2021-06-26 04:51:42 字數 2317 閱讀 8117

求全源最短路徑可以採用單源最短路徑演算法實現,如採用貪心演算法的dijkstra,時間開銷為|v|*o(e+vlgv),動態規劃的bellman-ford, |v|*o(v pow 2 *e),還有bellman的優化演算法spfa。但是呢,這樣無疑會在時間開銷上花費昂貴。

假設我們採用bellman-ford演算法,

for (int i = 1; i < numofvertex; i ++)      //這裡迴圈從1開始是因為開始節點已經存放在s中了,還有numofvertex-1個節點要處理       

}

}

} }

看看矩陣的乘法:

for(i=0;i<

this

->m;i++)    

for(j=0;j

}  那麼如果要用floyd求全源最短路徑可以加上乙個for迴圈,內部的可以定義為矩陣乘法的結構。 

floyd演算法可以說是warshall演算法的擴充套件,三個for迴圈就可以解決問題,所以它的時間複雜度為o(n^3)。

floyd演算法的基本思想如下:從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。所以,我們假設dis(ab)為節點a到節點b的最短路徑的距離,對於每乙個節點x,我們檢查dis(ax) + dis(xb) < dis(ab)是否成立,如果成立,證明從a到x再到b的路徑比a直接到b的路徑短,我們便設定dis(ab) = dis(ax) + dis(xb),這樣一來,當我們遍歷完所有節點x,dis(ab)中記錄的便是a到b的最短路徑的距離。

但是這裡我們要注意迴圈的巢狀順序,如果把檢查所有節點x放在最內層,那麼結果將是不正確的,為什麼呢?因為這樣便過早的把i到j的最短路徑確定下來了,而當後面存在更短的路徑時,已經不再會更新了。

給出如下的**:

#include #include #include #include using namespace std;     

int map[6] = ,

,

,

,

,

};

void dijkstra(

const int numofvertex, /*節點數目*/

const int startvertex, /*源節點*/

int (map)[6], /*有向圖鄰接矩陣*/

int *distance, /*各個節點到達源節點的距離*/

int *prevvertex /*各個節點的前乙個節點*/

)

prevvertex[ startvertex ] = -1; //源節點無前乙個節點

/*開始使用貪心思想迴圈處理不在s集合中的每乙個節點*/

isins[startvertex] = true; //開始節點放入s集合中

int currentvertex = startvertex;

for (int i = 1; i < numofvertex; i ++) //這裡迴圈從1開始是因為開始節點已經存放在s中了,還有numofvertex-1個節點要處理

}

isins[currentvertex] = true;//將這個節點currentvertex放入s集合中

//step3

/*對這個新的currentvertexc做鬆弛計算,更新distance*/

for (int j =0; j < numofvertex; j ++)

}

}

}

}

void display(int (arr)[6], int numofvertex)

cout << "路徑:";

即5到節點0之間的距離為無窮。很明顯的知道0到5的距離是9,由於這是無向圖,5到0的距離也是9,所以將k迴圈兩圈,及c<1改為c<2讓他可以來的及更新值,得到如下的結果:

Floyd演算法 多源最短路徑

解決稠密圖較好 準備工作 include floyd演算法解決稠密圖時更好 include include include using namespace std const int maxv 100 定義邊 typedef struct enode edge 定義鄰接矩陣儲存的圖 typedef ...

Floyd 演算法求多源最短路徑

floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...

Floyd 演算法求多源最短路徑

floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...