資料結構(C )Floyd演算法

2021-10-01 03:53:40 字數 2077 閱讀 8923

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個或多個輸入,至少乙個輸出,輸出可以是列印輸出或者返回乙個值 有 窮 性 演算法在執行有限步驟後,自動結束而不會出現無限迴圈,並且每乙...