每隊頂點之間的最短路徑(弗洛伊德演算法)

2021-07-22 19:00:45 字數 948 閱讀 2621

floyd演算法

又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

通過乙個圖的權值

矩陣求出它的每兩點間的

最短路徑矩陣。

從圖的帶權

鄰接矩陣a=[a(i,j)] n×n開始,

遞迴地進行n次更新,即由矩陣d(0)=a,按乙個公式,構造出矩陣d(1);又用同樣地公式由d(1)構造出d(2);……;最後又用同樣的公式由d(n-1)構造出矩陣d(n)。矩陣d(n)的i行j列元素便是i號頂點到j號頂點的最短路徑長度,稱d(n)為圖的

距離矩陣,同時還可引入乙個後繼節點矩陣path來記錄兩點間的最短路徑。

採用鬆弛技術(

鬆弛操作),對在i和j之間的所有其他點進行一次鬆弛。所以時間複雜度為o(n^3);

其狀態轉移方程如下:

map[i,j]:=min;

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

i,j的斷點

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

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

#includeusing namespace std;

#define maxv 4

#define inf 100000

typedef structmgraph;

void dispath(mgraph g,int a[maxv],int path[maxv])

printf("\t路徑長度為:%d\n",a[i][j]);}}

}}void floyd(mgraph g)

}} }

dispath(g,a,path);

}int main()

最短路徑之弗洛伊德

floyd演算法是大二到大三期間集訓時候才算真正接觸的,或許只有前一段時間dp的積累現在才算是真正理解 這個演算法需要充分理解dp的滾動陣列思想才能算是真正的掌握 floyd演算法又稱為插點法 演算法的目標是要求圖中所有兩個點的最短距離,就用dis i j 來表示 但是dis i j 是不夠設定為狀...

弗洛伊德演算法(每一對頂點之間的最短路徑)

for int i 1 i vtxnum i for int j 1 j vtxnum j for k 1 k vtxnum k 中間點 for int i 1 i vtxnum i for int j 1 j vtxnum j if dist i k dist k j dist i j dist是...

弗洛伊德演算法求最短路徑

include includeusing namespace std 鄰接矩陣的型別定義 define max 10000000 define max vertex num 20 typedef struct mgraph 構造有向網的鄰接矩陣 void createdn am mgraph g,i...