如果要得到圖中各個頂點之間的最短路徑,方法1:可以對每乙個頂點採用dijkstra演算法;方法2:可以採用floyd演算法,它是一種用來求雙源點之間最短路徑的演算法,採用鄰接矩陣來儲存圖
輔助結構
int d[maxsize]
[maxsize]
;//表示從各個頂點之間最短路徑長度
例:d[i][j]:表示從i頂點到j頂點的最短路徑長度
bool p[maxsize]
[maxsize]
[maxsize]
;//表示最短路徑上的結點
p[i]
[j][u]
=true
;//u頂點存在於從i到j最短路徑上
簡單示例
輸入為下圖:
三四∞4
11∞411
∞46∞
46d6
∞26∞
26∞2
5∞23
∞∞37
∞37∞
37∞\
abac\ab
ac\ababc\ab
abcpba\
bcba\bc
ba\bcbca\bc
cacb\ca
cab\
cacab\ca
cab\
一:初始的d陣列為各點之間的權值,p表示各點之間最短路徑所包含的結點
二:加入a點為各點之間的中轉點,對兩個陣列進行更替,用黃色字型標出
三:加入b點…
四:加入c點…
當所有點都被做為過中轉點,演算法結束
floyd演算法
void
floyd
(mgraph& g)
//更新陣列,儲存路徑
for(u =
0; u < g.vexnum;
++u)
for(i =
0; i < g.vexnum;
++i)
for(j =
0; j < g.vexnum;
++j)
if(i!=j&&d[i]
[u]+ d[u]
[j]< d[i]
[j])
//對每個結點對加入u結點進行判斷
}
完整示例
將上面的圖作為輸入:
#include
#define infini int_max/3
//最大值不選取int_max,是防止溢位
#define maxsize 3
//頂點數目
#define max 5
//邊的個數
//鄰接矩陣
typedef
struct
mgraph;
bool p[maxsize]
[maxsize]
[maxsize]
;//表示最短路徑上的結點
int d[maxsize]
[maxsize]
;//表示從各個頂點之間最短路徑長度
void
floyd
(mgraph& g)
;//求最短路徑
intmain()
;//頂點資訊
int arcdata[max][3
]=,,
,,};
//連線的邊
int i, j;
for(i =
0; i < g.vexnum;
++i)
for(i =
0; i < g.arcnum; i++
) g.arc[arcdata[i][0
]][arcdata[i][1
]]= arcdata[i][2
];//初始化完畢
cout <<
"求各點間最短路徑: "
; cout << endl;
floyd
(g);
int c;
for(i =
0; i < g.vexnum;
++i)
for(j =
0; j < g.vexnum;
++j)
cout << vexdata[i]
<<
"到"<< vexdata[j]
<<
"的路徑長度為:"
<< d[i]
[j]<<
" 包含頂點:"
;for
(c =
0; c < g.vexnum;
++c)
if(p[i]
[j][c]
==true
) cout << vexdata[c]
<<
' ';
cout << endl;
} cout << endl;
return0;
}void
floyd
(mgraph& g)
//更新陣列,儲存路徑
for(u =
0; u < g.vexnum;
++u)
for(i =
0; i < g.vexnum;
++i)
for(j =
0; j < g.vexnum;
++j)
if(i!=j&&d[i]
[u]+ d[u]
[j]< d[i]
[j])
//對每個結點對加入u結點進行判斷
}
程式的輸出結果為:
dijkstra演算法求最短路徑:
floyd演算法(最短路徑)
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...
最短路徑Floyd演算法
前面我們介紹了單源最短路徑問題的dijkstra演算法,dijkstra演算法雖然有比較好看的複雜度,但其對於有負權值的圖來講,就顯得力不從心了,下面我們來介紹另一種更為廣泛的最短路徑問題的解法 floyd演算法 floyd演算法 弗洛伊德演算法 的原理基於動態規劃,比如要找出從a到b的經過這k個點...
Floyd最短路徑演算法
1398 工程 time limit 1 sec memory limit 128 mb submit status web board description 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某...