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 就得輸入乙個數按一下回車,當輸入第三個數之後,你按了回車了,...