Dijkstra 演算法 初學者理解

2021-10-10 18:34:28 字數 2302 閱讀 9705

dijkstra演算法

一.該演算法的背景和目的:

迪傑斯特拉演算法(dijkstra)是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。

是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。迪傑斯特拉演算法主要特點是從起始點開始,採用貪心演算法的策略,每次遍歷到始點距離最近且未訪問過的頂點的鄰接節點,直到擴充套件到終點為止。

二.基本思想:

如1.1這個圖 求其最短路徑(a是最初點)

將圖中頂點分為兩個集合,乙個集合存放已求出初始到該點最短距離的點,另乙個集合v存放其他各點,s集合的初始化裡面有v0點(初始點a)

每求得一條最短路徑 , 就將加入到集合s中,直到全部頂點都加入到s中,演算法就結束了),

如圖1.2:

tips:v是在s裡面的點 k是在u裡面的點

1.若v與u中頂點u有邊,則(u,v)為正常權值,若u不是v的出邊鄰接點,則(u,v)權值 ∞(巨集定義#define max int_max);

2.從中選取乙個距離v最小的頂點k,把k,加入s中(該選定的距離就是v到k的最短路徑長度)。

3.以k為新考慮的中間點,修改u中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

4.重複步驟b和c直到所有頂點都包含在s中。

三.討論dijkstra演算法基於的儲存結構

1.問題圖的儲存: 一般採用二維鄰接矩陣儲存

如該1.1圖儲存的的二維鄰接矩陣為

2.輔助陣列int 型別 updatedist[n] //不斷更新最近距離 (可以定義乙個key和distance的結構體)

int類的:

struct型別:

這篇以int為主要討論的型別

3.輔助陣列 string型別 path[n] //存放初始點a到n的距離

如 path[1] 是存放 a到b點最短怎麼走的路徑

path[2] 是存放 a到c點最短怎麼走的路徑

path[3] 是存放 a到e點最短怎麼走的路徑

path[4] 是存放 a到h點最短怎麼走的路徑

4.集合s的表示

方法一:利用結構體的flag標記

方法二: 迭代完的點用updatedist[x]==0 來標記

四.寫的細碎的**(僅供參考)

直到updatedist陣列裡面全是0,就全部迭代結束了

五.具體**實現

dijkstra

(int v,edge[

])//從源點v出發

for(num =

1; num < vertexnum; num++

)dist[k]=0

;//將頂點k加到集合s中

}}

傳入初始點和鄰接矩陣

int

main()

六.注意這就是用鄰接矩陣實現dijkstra,但是這個演算法有乙個壞處,就是出現負權邊,這個演算法就炸了。

1.不能出現負權邊

2.時間複雜度是o(n^2)

初學者如何理解遞迴

0 遞迴的定義 如果你沒明白遞迴的定義,參見本文 0.遞迴的定義 1 從斐波那契數列開始 斐波那契的遞推公式 斐波那契數列遞迴演算法和遞推公式類似 int fibo int x 就這麼簡單?沒錯,通過這個例子可以看出,遞迴函式只需要寫兩部分,乙個是遞迴終止條件 if x 3 return 1 乙個是...

初學者談初學者學html

這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...

初學者的演算法筆記

關於scanf函式,你再裡面填的是上面,在輸入的時候就要嚴格按照這個格式輸入,比如你寫的scanf d d d a,b,c 這句你最後按乙個回車,代表輸入結束,這時就會出結果,但是如果你這樣寫scanf d n d n d n a,b,c 就得輸入乙個數按一下回車,當輸入第三個數之後,你按了回車了,...