C Dijkstra演算法求最短路徑

2021-10-10 00:18:40 字數 1487 閱讀 4199

前置知識

我的淺顯理解

對於乙個圖,首先源點加入乙個集合(點的集合)裡,然後去找和已知點集相連邊權最小的點,將該點加入點集,更新源點到各點的最短距離,重複以上操作,直到擴充套件結束!

例子下面以乙個比較簡單的有向帶權圖為例 (就是嚴版資料結構第二版裡的例題)

一維陣列s,記錄是否已找到源點到相應點的最短路徑

二維陣列path,記錄最短路徑

一維陣列d,記錄最短路徑的總邊權

具體實現**

#include

#include

#include

#include

using

namespace std;

int max;

//最大值

int node_num;

//點數

int len_num;

//邊數

bool s[

100]=;

//是否已加入已選點集,即是否已找到源點到相應點的最短路徑

int d[

100]

;//源點到相應點的最短路徑權值

vector

int>

>

path

(100);

int g[

100]

[100];

//鄰接表

void

dijkstra

(int v0)

d[v0]=0

;//v0到v0的距離為0

s[v0]=1

;//將源點加入點集

int pos=0;

for(

int i =

1; i < node_num; i++)}

s[pos]=1

;for

(int j =

0; j < node_num; j++)}

}}intmain()

int v0;

cout <<

"輸入源點:"

; cin >> v0;

dijkstra

(v0)

;for

(int i =

0; i < node_num; i++)if

(d[i]

== max) cout <<

"不連通"

<< endl;

else cout <<

" 總邊權:"

<< d[i]

<< endl;

}return0;

}/*6 80 2 10

0 4 30

0 5 100

1 2 5

2 3 50

4 3 20

4 5 60

3 5 10

*/

ps:希望對你有幫助!

Bellman Ford演算法求最短路

圖論中比較基礎的問題,求單源最短路,即在圖中找乙個點作為起點,求他到其他點的最短路,而bellman ford演算法是其中最簡單的演算法,相應地,其複雜度也比較高,效率也比較低,但是,他卻可以判斷圖中是否存在負權迴路 走一圈經過的權值是負數 因此可以處理帶有負權邊的圖,且該演算法是其他各種最短路演算...

dijkstra演算法求最短路

演算法思想 用乙個dis陣列記錄源點到其他各點的路徑,例如 如果v0是源點,那麼dis 1 就表示v0到v1的最短距離 用乙個vis陣列記錄頂點有沒有被當成出發點。如果第乙個出發點 源點 到別的點的路都已經走完了,那就找一下個目前距離源點最近的點作為出發點,標誌為1。然後繼續尋找最短路徑,如果dis...

Floyd演算法(求最短路)

百科名片 弗洛伊德演算法 floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。通過乙個圖的權值矩陣求出它的每兩點間的最短路徑 矩陣。從圖的帶權鄰接矩陣a a ...