最短路徑之弗洛伊德演算法(Floyd) 動態規劃

2021-09-13 13:57:38 字數 2660 閱讀 7422

弗洛伊德演算法(floyd)主要針對多源最短路徑,且可以解決路徑中有負權的情況(不包含負權迴路),但是迪傑斯特拉演算法只能解決正權值的單源最短路徑(可以迭代多次求多源)。

1.弗洛伊德演算法的基本思想

弗洛伊德演算法從圖的帶權鄰接矩陣cost出發,

假設求從頂點viv_

vi​到vjv_

vj​的最短路徑:

如果從viv_

vi​到vjv_

vj​有弧,則從viv_

vi​到vjv_

vj​存在一條長度為arcs[i][j]的路徑,但是不一定是最短的,還需進行n次試探。

2.弗洛伊德演算法的基本表示

弗洛伊德演算法屬於動態規劃演算法的一種,而動態規劃演算法的關鍵是:

3.弗洛伊德演算法的實現

有了動態遞迴方程和初始條件,我們就可以編寫**像解數列公式一樣求出各對頂點間的最短路徑。

只需注意問題的初始化和主變數的確定,這個問題的主變數是中間頂點的標號,應該將其放在最外層迴圈,就像數列遞推公式的下標一樣。

為了儲存最短路徑序列,我們還需要乙個陣列path,且path[v][w]儲存v

vv到w

ww的最短路徑上v

vv的後繼節點,初始化為w

ww。最後可以通過遞迴列印v

vv到w

ww的最短路徑。

關鍵**:

void

shortestpath_floyd

(mgraph g,

int*

* path,

int*

*distance)

}// 3個for迴圈更新ditance共n-1次

for(u =

0; u < g.vexnum; u++)}}}}

完整**:

#include

#include

using namespace std;

#define max_vex_num 50

// 定義圖的鄰接矩陣儲存

typedef

struct mgraph mgraph;

void

creategraph

(mgraph& g)

;int

locate

(mgraph g, string u)

;void

showmatrix

(mgraph g)

;void

shortestpath_floyd

(mgraph g,

int*

* path,

int*

*distance)

;void

showpath

(mgraph g,

int*

* path,

int start,

int end)

;//列印start-end的最短路徑

intmain()

shortestpath_floyd

(g, path, distance)

; cout <<

"path矩陣:\n"

;for

(int i =

0; i < g.vexnum; i++

)showpath

(g, path,0,

2);// 釋放記憶體

for(

int i =

0; i < g.vexnum; i++

) delete[

] path;

delete[

] distance;

system

("pause");

return0;

}void

showpath

(mgraph g,

int*

* path,

int start,

int end)

cout <<

"-->"

<< g.vexs[end]

<< endl;

}void

showmatrix

(mgraph g)

cout << endl;}}

void

creategraph

(mgraph& g)

cout <<

"輸入圖的邊的權值資訊vi vj weight:\n"

;for

(i =

0; i < g.arcnum; i++

)}

測試用例:

3 5

v0 v1 v2

v0 v1 4

v0 v2 11

v1 v0 6

v1 v2 2

v2 v0 3

即帶權有向圖:

參考資料

《資料結構 c語言描述》 嚴蔚敏著

最短路徑之弗洛伊德

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

MPI之弗洛伊德最短路徑演算法

include include include for debugging include const int infinity 1000000 void read matrix int local mat,int n,int my rank,int p,mpi comm comm void pri...

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

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