Floyd演算法 多源最短路徑

2021-10-04 05:46:03 字數 2106 閱讀 2679

解決稠密圖較好

準備工作

#include

//floyd演算法解決稠密圖時更好

#include

#include

#include

using

namespace std;

const

int maxv =

100;

/*定義邊*/

typedef

struct enode

* edge;

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

typedef

struct gnode

* mgraph;

/*圖的初始化*/

mgraph craetegraph

(int nv)

void

insertedge

(mgraph g, edge e)

mgraph buildgraph()

delete e;

return g;

}

核心演算法

//dp問題dp(k)[i][j]表示: 從i到j的最短路徑,k == -1時,表示直接i到j的最短路徑, k表示計算的步驟

//狀態轉換方程: dp(k)[i][j] = min

void

folyd

(mgraph g,

int dp[

][maxv]

,int path[

][maxv]

)/*dp填表過程*/

for(

int k =

0; k < g-

>nv; k++

)for

(int i =

0; i < g-

>nv; i++

)for

(int j =

0; j < g-

>nv; j++)if

(dp[i]

[j]> dp[i]

[k]+ dp[k]

[j])

}void

serch_path

(mgraph g,

const

int path[

][maxv]

,int i,

int j)

serch_path

(g, path, i, path[i]

[j])

;serch_path

(g, path, path[i]

[j], j);}

void

print

(mgraph g,

const

int path[

][maxv]

,int i,

int j)

intmain()

delete g;

system

("pause");

return0;

}

執行結果

輸入有向圖:

101701

2125

1320

3524

8254

3543

6245

2563

4755

7958

6687

7837

9489

8輸入起點和終點:09

0->1-

>3-

>5-

>4-

>7-

>

9 dist=

19輸入起點和終點:90

9->7-

>4-

>5-

>3-

>1-

>

0 dist=

19輸入起點和終點:94

9->7-

>

4 dist=

9輸入起點和終點:22

2->

2 dist=

0輸入起點和終點:

651231

資料不合法

輸入起點和終點:-1

-1請按任意鍵繼續.

..

Floyd 演算法求多源最短路徑

floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...

Floyd 演算法求多源最短路徑

floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...

多源最短路 Floyd演算法

問題的提出 已知乙個有向網 或者無向網 對每一對定點vi vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。解決該問題有以下兩種方法 1 輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...