日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

弗洛伊德算法_弗洛伊德算法

發(fā)布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 弗洛伊德算法_弗洛伊德算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前面Dijkstra算法和Bellman-Ford算法解決了單源最短路徑問題,但是如果需要獲取圖中任意兩頂點的最短距離呢?我們可以使用前面兩個算法我們可以遍歷每個頂點得到每個頂點的單源最短距離,但是最短路徑算法中提供了一種更為簡單的算法幫助我們實現(xiàn)任意兩頂點最短距離(Floyd)。

弗洛伊德算法

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。