【转】dijkstra算法
【轉】dijkstra算法
來自:https://blog.csdn.net/tw_345/article/details/50109375#comments 2015年11月30日 10:55:08 閱讀數:1241說到dijkstra,它其實是我第一個公司的Wi-Fi密碼,當時我還不知道它就是求最短路徑的一個算法。今天有幸能領略這位荷蘭科學家的智慧~
Dijkstra算法是求某個源點到其他各頂點的最短路徑的。
書本上的公式有點復雜,不如先看個例子再去理解公式~
?
比如上圖這道題(ppt畫的,湊合看吧~)
運用dijkstra,求V0到各點的最短路徑?
?
解答具體過程:
令S表示已求出最短路徑的頂點集合。D[i]表示V0到Vi的路徑長度。arcs[i][j]表示從i到j的直接距離
第一步:V0到其他頂點的直接路徑:
?
| S | D[1] | D[2] | D[3] | D[4] | D[5] |
| {V0} | 50 | 10 | ∞ | 45 | ∞ |
下一步:計算min{D[i]},得到D[2]最小,便將V2加入S中,得到V0V2最短路徑10,重新計算V0到各點路徑:
D[1](new) = min{D[1](old) ,D[2]+arcs[2][1]} = min{50,10+∞}=50
D[3](new) = min{D[3](old) ,D[2]+arcs[2][3]} = min{∞,10+15}=25
D[4](new) = min{D[4](old) ,D[2]+arcs[2][4]} = min{45,10+∞}=45
D[5](new) = min{D[5](old) ,D[2]+arcs[2][5]} = min{∞,10+∞}=∞
得到
| S | D[1] | D[2] | D[3] | D[4] | D[5] |
| {V0,V2} | 50 | 25 | 45 | ∞ |
下一步:(也不能說下一步,反正就是循環)計算min{D[i]},D[3]最小,V3加入S中,得到V0V3最短路徑25,重新計算路徑:
D[1](new) = min{D[1](old) ,D[3]+arcs[3][1]} = min{50,25+20}=45
D[4](new) = min{D[4](old) ,D[3]+arcs[3][4]} = min{45,25+20}=45
D[5](new) = min{D[5](old) ,D[3]+arcs[3][5]} = min{∞,25+∞}=∞
得到
| S | D[1] | D[2] | D[3] | D[4] | D[5] |
| {V0,V2,V3} | 45 | 45 | ∞ |
怎么樣?是不是很帶感
下一步:計算min{D[i]},D[1](看1比較順眼)最小,V1加入S中,得到V0V1最短路徑45,重新計算路徑:
D[4](new) = min{D[4](old) ,D[1]+arcs[1][4]} = min{45,45+10}=55
D[5](new) = min{D[5](old) ,D[1]+arcs[1][5]} = min{∞,45+∞}=∞
得到
| S | D[1] | D[2] | D[3] | D[4] | D[5] |
| {V0,V2,V3,V1} | 45 | ∞ |
下一步:計算min{D[i]},D[4]最小,V4加入S中,得到V0V4最短路徑45,重新計算路徑:
D[5](new) = min{D[5](old) ,D[4]+arcs[4][5]} = min{∞,45+∞}=∞
得到
| S | D[1] | D[2] | D[3] | D[4] | D[5] |
| {V0,V2,V3,V1,V4} | ∞ |
得到V0V5最短路徑∞,
所以最短路徑為
?
| V0V1 | 45 |
| V0V2 | 10 |
| V0V3 | 25 |
| V0V4 | 45 |
| V0V5 | ∞ |
Dijkstra算法的基本思想是:按最短路徑長度遞增的順序,逐個產生各最短路徑。
那么如何遞增呢?其實是運用一條性質:如果存在一條從i到j的最短路徑(Vi.....Vk,Vj),Vk是Vj前面的一頂點。那么(Vi...Vk)也必定是從i到k的最短路徑。
然而這條性質是如何得到呢,這就需要我們先弄清楚最短路徑的“最優子結構性質”。
最優子結構性質:如果P(i,j)={Vi....Vk..Vs...Vj}是從頂點i到j的最短路徑,k和s是這條路徑上的一個中間頂點,那么P(k,s)必定是從k到s的最短路徑。下面用反證法證明:
假設P(i,j)={Vi....Vk..Vs...Vj}是從頂點i到j的最短路徑,則有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是從k到s的最短距離,那么
必定存在另一條從k到s的最短路徑P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。則與P(i,j)是從i到j的最短路徑相矛盾。因此該性質得證。
?
好了,鋪墊的差不多了,Dijkstra就提出了以最短路徑長度遞增,逐次生成最短路徑的算法。譬如對于源頂點V0,首先選擇其直接相鄰的頂點中長度最短的頂點Vi(注意相鄰和最短),那么當前已知可得從V0到達Vj頂點的最短距離dist[j]=min{dist[j],dist[i]+arcs[i][j]}。
根據這種思路,假設存在G=<V,E>,源頂點為V0,S={V0}, dist[i]記錄V0到Vi的最短距離,path[i]記錄從V0到Vi路徑上的Vi前面的一個頂點。
1.從不在S的V中選擇使dist[i]值最小的頂點i,將i加入到S中;
2.更新與i直接相鄰頂點的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]});(上例是全部更新,不直接相鄰就用“∞”表示)
3.直到S=V。
代碼實現:(代碼來源于網絡)
?
?
posted on 2018-07-26 15:37 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的【转】dijkstra算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2017更新后 在WIN7上找不到
- 下一篇: c# LUA 互通,相关资料收集