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
int
d[1000][1000],path[1000][1000];
int
main()
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]);
int
f,en;
scanf
(
"%d%d"
,&f,&en);
while
(f!=en)
printf
(
"%d\n"
,en);
return
0;
}
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
using
namespace
std;
const
int
&inf=100000000;
void
floyd(vector > &distmap,
//可被更新的鄰接矩陣,更新後不能確定原有邊
vector > &path)
//路徑上到達該點的中轉點
//福利:這個函式沒有用除inf外的任何全域性量,可以直接複製!
}
void
print(
const
int
&beg,
const
int
&end,
const
vector > &path)
//傳引用,避免拷貝,不占用記憶體空間
//也可以用棧結構先進後出的特性來代替函式遞迴
else
cout<<
"->"
<}
int
main()
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 的路徑的長度,取其中較短...