弗洛伊德算法_弗洛伊德算法
弗洛伊德算法
Floyd算法又稱為插點法,是一種利用動態(tài)規(guī)劃的思想尋找給定的加權(quán)圖中多源點之間最短路徑的算法,與Dijkstra算法類似。 該算法名稱以創(chuàng)始人之一、1978年圖靈獎獲得者、斯坦福大學(xué)計算機科學(xué)系教授
核心思路
使用鄰接矩陣G來表示圖,初始化G,將不可直達的頂點初始化為無窮大,定義k結(jié)點,遍歷N個頂點->k,使用k作為任意兩頂點i,j之間的中介點,
如果G[i][j]>G[i][k]+G[k][j],則執(zhí)行松弛操作,這里我們就可以理解為什么叫插點法了,將每一個頂點當(dāng)作中介點放入任意兩頂點之間,
如果可以執(zhí)行松弛操作,則進行松弛。
推導(dǎo)過程
V0->V1 1V0->V2 2V1->V2 -1初始化圖G,執(zhí)行如下操作
第一輪:
第一步:選取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作為中介點,重復(fù)上面操作(這一輪會松弛 G[0][2]>G[0][1]+G[1][2]->2>1+(-1) 滿足條件,松弛)
第二輪在選取V2作為中介點,重復(fù)上面操作
最終得到最短路徑
實現(xiàn)代碼
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; } //動態(tài)規(guī)劃找中介 for (int k=0; kG[i][k]+G[k][j]){ G[i][j]=G[i][k]+G[k][j]; } } } } //最短路徑 cout<總結(jié)
以上是生活随笔為你收集整理的弗洛伊德算法_弗洛伊德算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些深度相机有python接口_pyth
- 下一篇: dma访问主存时_DMA导致Cache数