floyd演算法的實現**相對於dijkstra演算法更為簡單和方便,但是其思想還是比較麻煩的,剛開始理解起來比較困難,就直接開始寫了**,但是對於求解路徑的時候發現,如果沒有理解內部思想,在做一些小改變的時候還是不太好做的。
設圖 g 用鄰接矩陣法表示,
求圖 g 中任意一對頂點vi、 vj間的最短路徑。
(1) 將vi到vj 的最短的路徑長度初始化為(vi, vj), 然後進行如下n次比較和修正:
(2)在vi、vj間加入頂點v0,比較(vi, v0, vj)和(vi, vj)的路徑的長度,取其中較短的路徑作為vi到vj的且中間頂點號不大於0的最短路徑。
(3) 在vi、vj間加入頂點v1,
得(vi, …,v1)和(v1, …,vj),其中:
(vi, …, v1)是vi到v1 的且中間頂點號不大於0的最短路徑,
(v1, …, vj) 是v1到vj 的且中間頂點號不大於0的最短路徑,
這兩條路徑在上一步中已求出。
將(vi, …, v1, …, vj)與上一步已求出的且vi到vj 中間頂點號不大於0的最短路徑比較,取其中較短的路徑作為vi到vj 的且中間頂點號不大於1的最短路徑。
(4)在vi、vj間加入頂點v2,得
(vi, …, v2)和(v2, …, vj), 其中:
(vi, …, v2)是vi到v2 的且中間頂點號不大於1的最短路徑,
(v2, …, vj) 是v2到vj 的且中間頂點號不大於1的最短路徑,
這兩條路徑在上一步中已求出。
將(vi, …, v2, …, vj)與上一步已求出的且vi到vj 中間頂點號不大於1的最短路徑比較, 取其中較短的路徑作為vi到vj 的且中間頂點號不大於2的最短路徑。
……把所以的點都試過後,就可以得到全部頂點之間的最短路徑
圖的儲存結構:帶權的鄰接矩陣儲存結構
陣列dist[n][n]:存放在迭代過程中求得的最短路徑長度。迭代公式:
陣列path[n][n]:
存放從vi到vj的最短路徑。
加入路徑:1->5->4->7->8
需要這條路上的各個節點都能被列舉到,最簡單的方式就是
path[1][8]=5
path[5][8]=4
path[4][8]=7
path[7][8]=8
這樣就可以輸出他的路徑了,path儲存的是 i 到 j 點的最短路徑中 i 點的下乙個頂點,迴圈輸出即可遍歷完成。
直接利用乙個結構體陣列來儲存,就不用分開dist變數和path變數了。
剛開始為所有的space元素如果i==j則賦值為0,不是0賦值無窮大。pre元素為前驅節點了,此時i到j的前驅是i。
floyd演算法中對各個邊進行鬆弛操作,如果有更短的邊的話,就重新賦值,並且記錄路徑為k。
因為這個地方儲存的是i到j的前驅,所以輸出的時候需要利用棧,先進後出,這樣輸出的時候順序才對。
#include
#include
using
namespace std;
const
int inf =
99999999
;stack<
int>s;
int n, m;
struct node
map[
110]
[110];
void
input()
int a, b, x;
for(i =
0; i < m; i++)}
void
floyd()
}}}}
void
output()
while
(!s.
empty()
) cout <<
"v"<< j << endl;}}
}}intmain()
最近一直凌晨1點左右才能睡著,不管是幹什麼或者早睡覺,所以。。可以隨便看書或者看自己感興趣的看到1點了,hhh, 資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 演算法
程式設計 資料結構 演算法 演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 輸入 輸出 0個或多個輸入,至少乙個輸出,輸出可以是列印輸出或者返回乙個值 有 窮 性 演算法在執行有限步驟後,自動結束而不會出現無限迴圈,並且每乙...