Dijkstra算法

1.算法思想

? ? ?a.輸入(即已知條件): 有權(quán)重的無向圖G={E,V},V是頂點的集合,E是邊的集合 ,每一邊皆有權(quán)重(大于零),源節(jié)點s和目的節(jié)點d都屬于集合V(s∈V, d∈V)。輸出(即求得的結(jié)果): 源節(jié)點s到所有其它節(jié)點的最短路徑的長度。

????b.初始化階段,除了起點A外,所有節(jié)點的距離dist設(shè)置為無窮大。


????c.更新鄰居的距離起點A的鄰居為為B,D,根據(jù)邊AB、AD的權(quán)重,將其距離分別更新為Distance(B)=2,Distance(D)=1


????d.移除有最小距離的點D由于A的鄰居節(jié)點是B和D,Distance(B)=2>Distance(D)=1,所以移除D點。


? ? e.以移除的D為起點進行更新分別計算D的鄰居節(jié)點的距離,等于AD的權(quán)重,加上DC、DF、DG、DE、DB的權(quán)重。



? ? ?f.移除B在未移除的節(jié)點中,選擇距離最小的B( distance =2)移除,并且更新鄰居?

????????注意:distance(D) ?D不用更新,因為D已知;distance(E)也不用更新,因為BD+DE=5,比前面計算的值3要大。



g.移除E,在未移除的節(jié)點中,選擇距離最小的E(distance =3)移除,并且更新鄰居,由于鄰居B、D已經(jīng)移除,所以不用更新; distance(G)也不用更新,因為BE+GE=16>distance(G)=5,比前面計算的值5要大。



h.移除C,在未移除的節(jié)點中,選擇距離最小的C(distance =3)移除,并且更新鄰居



i.移除G



j.最后移除F,并按前面原則更新各節(jié)點距離,到此,可以得到起點A到各個頂點的最短距離,完成了dijkstra的算法過程。


2.代碼實現(xiàn)

????以一個簡單的圖例實現(xiàn):


1.使用guava中的ValueGraphBuilder構(gòu)造圖的實例,并輸入邊集:


????通過調(diào)試可以看到返回值為:
????nodes: [v0, v2, v4, v5, v1, v3],?

????edges: {<v0 -> v2>=10, <v0 -> v4>=30, <v0 -> v5>=100, <v2 -> v3>=50, <v4 -> v3>=20, <v4 -> v5>=60, <v1 ????-> v2>=5, <v3 -> v5>=10}

2.構(gòu)建一個臨時結(jié)構(gòu),用于存儲每個節(jié)點運算時的中間結(jié)果


3.初始化NodeExtra

4.初始化之后的數(shù)據(jù)如下,以V2為例,V2到V0的距離為10,路徑為V0->V2,并且此時V2并未經(jīng)過算路,visited為false

5.首次進入可以設(shè)置節(jié)點最短路徑為0

6.找出當前離V0路徑最短的節(jié)點

如下如所示。找到當前最短路徑節(jié)點

7.并入新查找的節(jié)點后,更新與其相連接節(jié)點的最短路徑中間結(jié)果

由圖中可以看出與V2相連的節(jié)點為V3,此時更新了V3的中間結(jié)果,注:此時只是更新了V3到V0的最短距離,并未更新V3到V0的路徑


重復(fù) 6 此時,首次循環(huán)已經(jīng)結(jié)結(jié)束,開始下一次循環(huán),已經(jīng)并入新查找的節(jié)點,不參與計算。第二次找到V4為最近的節(jié)點


重復(fù) 7 再次更新與V4相連的節(jié)點,V3和V5到V0的最短距離

重復(fù)上述操作,直到找出所有節(jié)點。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容