求最短路徑(dijkstra)

2021-05-23 03:24:00 字數 1288 閱讀 1058

因為要做一道題牽扯到最小路徑的演算法,所以就看了看締結斯特拉演算法。

看了演算法導論上面的介紹不明白,只好下了乙個**自己去看。

//單源圖最短路徑求法

int dijkstra(int from,int to ,int map[n])

}s[u]=1;

for(i=0;i

看了之後自己總結的一點點的經驗:

締結斯特拉演算法的步驟是這樣的:

1.將點集分成兩類,第一類是用過的一類是沒有用過的。

2.在沒有用過的點集中找到離遠點距離最小的點。

3.將此點加入已用點的集合中,因為這個點的加入,源點和未用過的點的最短路徑發生了變化。

4.重複上面的三項,直到終點被用了為止,即可得到源點到其他任意點的最短路徑。

覺得這像是一種貪心,可是感覺又不是,因為在找最優的過程中,每個點的dis一直在變化.不知道為什麼最小的路徑的長度就出來了.覺得這好像是乙個不可思議的事情.但求出來的確實是最短路徑.讓我們仔細的考慮一下這個演算法的過程.當除了源點其餘所有的點都沒有用的時候,這些點離源點的距離就是圖中真實的距離.找到最短的點放到已用的集合中,那麼毋庸置疑源點到這個點的路徑就定了下來就是源點直接到這個點的路徑,並不需要經過其他的點來達到這個點.這是已用集合中就有了兩個點,那麼源點就可以經過這個點到達或不經過這個點到達其他的點(這裡沒有不可到達的點,不可到達的點就是路徑比較長的點)。這其中做乙個選擇,看是經過這個點路徑短一些還是不經過這個點路徑短一些。所有的點做好選擇後就可以形成乙個新的陣列,這個陣列記錄了源點到未用過的點的距離,同樣選擇乙個最小的點加入到已用點中。就這樣已用點集合中有了三個點,源點到其餘兩個點到距離已經確定。下面反覆一下就可以得到源點到所有點的最短路徑,線面的**不僅可以求出路徑的長度,亦可以求出路徑的依次經過的點。

[4] 最短路徑

(1)單源最短路徑,dijkstra演算法,鄰接陣形式,複雜度o(n^2)

//求出源s到所有點的最短路經,傳入圖的頂點數n,(有向)鄰接矩陣mat

//返回到各點最短距離min和路徑pre,pre[i]記錄s到i路徑上i的父結點,pre[s]=-1

//可更改路權型別,但必須非負!

#define maxn 200

#define inf 1000000000

typedef int elem_t;

void dijkstra(int n,elem_t mat[maxn],int s,elem_t* min,int* pre){

int v[maxn],i,j,k;

for (i=0;ipre[i]中儲存了i點的上乙個點是那個。求路徑的話可以這樣依次的找上乙個點,知道找到源點結束即可。

Dijkstra求最短路徑

把m1.txt與可執行檔案放在統一路徑下 m1.txt 距離矩陣,9行9列 的資料如下 9999 6 3 1 9999 9999 9999 9999 9999 9999 9999 9999 9999 1 9999 9999 9999 9999 9999 2 9999 2 9999 9999 9999...

Dijkstra演算法求最短路徑

參考文獻 dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open,close表方式,drew為了和下面要介紹的 a 演算法和 d 演算法表述一致,這裡均採用open,close表的方式。大概過程 建立兩個表,open,close。open表儲存所有已生成而未考察的節點,...

Dijkstra演算法求最短路徑

dijkstra演算法用來求最短距離 已經實現了 那麼最短路徑 如何求解並列印出來呢?此處的方法是記錄路徑中結點的前驅 if v未被訪問 以u為中介點可以使起點s到頂點v的最短距離d v 更優 程式具體實現,鄰接矩陣版 n為頂點數,maxv為最大頂點數 int n,g maxv maxv 起點到達各...