解決稠密圖較好
準備工作
#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次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...