Floyd演算法 弗洛伊德演算法 百度百科

2022-03-01 08:17:41 字數 3636 閱讀 3228

for(int k=1; k<=node; ++k)//對於每乙個中轉點

for(int i=0; i<=node; ++i)//列舉源點

for(int j=0; j<=node; ++j)//列舉終點

if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不滿足三角不等式

其狀態轉移方程如下: map[i,j]:=min;

map[i,j]表示i到j的最短距離,k是窮舉i,j的斷點

,map[n,n]初值應該為0,或者按照題目意思來做。

當然,如果這條路沒有通的話,還必須特殊處理,比如沒有map[i,k]這條路。

編輯時間複雜度:o(n^3);

空間複雜度:o(n^2)[1]

編輯floyd演算法適用於apsp(all pairs shortest paths,多源最短路徑),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重迴圈結構緊湊,對於稠密圖,效率要高於執行|v|次dijkstra演算法,也要高於執行v次spfa演算法。

優點:容易理解,可以算出任意兩個節點之間的最短距離,**編寫簡單。

缺點:時間複雜度比較高,不適合計算大量資料。

編輯a) 初始化:d[u,v]=a[u,v]

b) for k:=1 to n

for i:=1 to n

for j:=1 to n

if d[i,j]>d[i,k]+d[k,j] then

d[i,j]:=d[i,k]+d[k,j];

c) 演算法結束:d即為所有點對的最短路徑矩陣編輯1

2345

6789

1011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

#include

#include

#define max 1000000000

intd[1000][1000],path[1000][1000];

intmain()

for(i=1;i<=m;i++)

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

}

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

if(i!=j)printf("%d->%d:%d\n",i,j,d[i][j]);

intf,en;

scanf("%d%d",&f,&en);

while(f!=en)

printf("%d\n",en);

return0;

}12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

49#include

#include

usingnamespacestd;

constint&inf=100000000;

voidfloyd(vector > &distmap,//可被更新的鄰接矩陣,更新後不能確定原有邊

vector > &path)//路徑上到達該點的中轉點

//福利:這個函式沒有用除inf外的任何全域性量,可以直接複製!

}

voidprint(constint&beg,constint&end,

constvector > &path)//傳引用,避免拷貝,不占用記憶體空間

//也可以用棧結構先進後出的特性來代替函式遞迴

elsecout<<"->"<}

intmain()

floyd(distmap,path);

cout<<"計算完畢,可以開始查詢,請輸入出發點和終點:";

cin>>beg>>end;

cout<<"最短距離為"<print(beg,end,path);

}

弗洛伊德(Floyd)演算法

弗洛伊德 floyd 演算法過程 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。演算法理解 最短距離有三種情況 兩點的直達距離最短。如下圖 兩點間只通過乙個中間點而距離最短。圖 兩點間用通過兩各以上的頂點...

弗洛伊德 Floyd 演算法

和dijkstra演算法一樣,弗洛伊德 floyd 演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名 弗洛伊德演算法 floyd 計算圖中各個頂點之間的最短路徑 迪傑斯特拉演算法用於計算圖中某乙...

弗洛伊德 Floyd 演算法

佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...