弗洛伊德算法_弗洛伊德算法
弗洛伊德算法
Floyd算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似。 該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授
核心思路
使用鄰接矩陣G來表示圖,初始化G,將不可直達的頂點初始化為無窮大,定義k結點,遍歷N個頂點->k,使用k作為任意兩頂點i,j之間的中介點,
如果G[i][j]>G[i][k]+G[k][j],則執行松弛操作,這里我們就可以理解為什么叫插點法了,將每一個頂點當作中介點放入任意兩頂點之間,
如果可以執行松弛操作,則進行松弛。
推導過程
V0->V1 1V0->V2 2V1->V2 -1初始化圖G,執行如下操作
第一輪:
第一步:選取V0作為中介點
第二步:插入任意兩頂點之間
首先插入V0->V0之間,G[0][0]>G[0][0]+G[0][0],(0>0不滿足)無需松弛,
再插入V0->V1之間,G[0][1]>G[0][0]+G[0][1],(1>0+1不滿足)無需松弛,
再插入V0->V2之間,G[0][2]>G[0][0]+G[0][2],(2>0+2不滿足)無需松弛。
首先插入V1->V0之間,G[1][0]>G[1][0]+G[0][0],(∞>∞+0不滿足)無需松弛,
再插入V1->V1之間,G[1][1]>G[1][0]+G[0][1],(∞>∞+1不滿足)無需松弛,
再插入V1->V2之間,G[1][2]>G[1][0]+G[0][2],(∞>∞+2不滿足)無需松弛。
......
第二輪在選取V1作為中介點,重復上面操作(這一輪會松弛 G[0][2]>G[0][1]+G[1][2]->2>1+(-1) 滿足條件,松弛)
第二輪在選取V2作為中介點,重復上面操作
最終得到最短路徑
實現代碼
main.cpp// Floyd Created by 陳龍// Copyright ? 2019 陳龍. All rights reserved.//#include using namespace std;int N,E;int main(int argc, const char * argv[]) { //N個頂點,E條邊 cin>>N>>E; int u,v,w; int G[N][N]; //初始化無窮大 for (int i=0; i>u>>v>>w; G[u][v] = w; } //動態規劃找中介 for (int k=0; kG[i][k]+G[k][j]){ G[i][j]=G[i][k]+G[k][j]; } } } } //最短路徑 cout<總結
以上是生活随笔為你收集整理的弗洛伊德算法_弗洛伊德算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些深度相机有python接口_pyth
- 下一篇: c++ 计算正弦的近似值_数值计算笔记1