最短路徑 Floyd演算法) c c

2021-10-02 19:01:58 字數 2981 閱讀 6860

如果要得到圖中各個頂點之間的最短路徑,方法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 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某...