如何理解Dijkstra演算法(最短路徑)

2021-08-18 13:21:45 字數 1895 閱讀 8541

假設

n=(v,)是連通網,v是頂點集合,共有n個頂點;

對「最短路徑「的兩個理解:

case-1,頂點v0到其它所有頂點的最短路徑。

case-2,頂點v0到頂點vi的最短路徑。

對於dijkstra演算法來說,一次性求出v0到其它所有頂點的最短路徑的時間複雜度是o(n^2).

dijkstra演算法採用貪心思想,從v0出發,層層向外擴散,一步步求出v0到vi之間所有頂點的最短路徑,最終求得了v0~vi的最短路徑。

也就是說,極端情況下,case-1和case-2的迴圈次數是完全一致的;大多數情況下,case-2要比case-1的迴圈次數要少;case-1和case-2共享同一種演算法,只不過在演算法迴圈過程中,當我們發現已經找出v0~vi的最短路徑後,跳出迴圈即為case-2,繼續迴圈即為case-1。

dijkstra演算法的輸入變數、輸出變數、輔助變數分別如下:

輸入變數:

圖(頂點集+邊集,可用鄰接矩陣也可用雙重鍊錶)

輔助變數:

int final[maxvex]:標誌位陣列,final[i]=1表示v0-vi的最短路徑已經求得。

輸出變數:

兩個陣列,分別是儲存頂點下標的陣列prevv[maxvex],以及儲存最短路徑長度的陣列shortpath[maxvex]。

prevv[maxvex]:prevv[i]=m的含義是,頂點v0到頂點vi的最短路徑的前置頂點是vm,也就是,該最短路徑為:

v0--->...--->vm--->vi

有了prevv,也就有了最短路徑樹。

shortpath[maxvex]:shortpath[i]=l的含義是,頂點v0到頂點vi的最短路徑長度是l。注意,演算法執行過程中,該陣列會被不斷修正,直到final[i]=1;

演算法的思路:

對於連通網n=(v, ),定義頂點集s為已經找到最短路徑的頂點集合,頂點集u為尚未找出最短路徑的頂點集合。d[v0, i]表示v0到i的當前最短路徑長度,w[i,j]表示i與j的邊長。d是路徑長度,w是相鄰頂點組成的邊長。用集合p來表示v0到各頂點最短路徑的前置頂點。

初始狀態:s=, u=v-s;(用final陣列來儲存s與u)

從u中選取乙個距離v0的路徑最短的頂點k,把k加入s;偽**:

min = max;

for(j in u)

}final[k] = 1;//表示將k加入到s中

以k做為途經點,修正v0到u中的

與k相鄰的各頂點的最短距離,也就是說,如果路徑v0->...->k->j的長度比路徑v0->...->j的原「最短「長度d[v0,j]更短,則取v0->...->k->j作為v0->..->j的最新最短路徑。偽**:

for(j in neighboursof(k))

}演算法偽**:

/*計算v0到其它各頂點的最短路徑

*/void minpath_dijkstra(graph g, int v0)

final[v0] = 1; //直接將v0納入已找到最短路徑的頂點集

short_path[v0] = 0; //不存在

for(i = 1; i < maxvex; i++)

}final[k] = 1; //表示v0到k的最短路徑已找到

for(j=0; j/*

v0到其它各頂點(尚未確定最短路徑的頂點)的最短路徑中,如果途經頂點k的路徑長度比原路徑更短,就更新。

此處min是v0到k的最短路徑,g[k][j]是邊的長度,short_path[j]是v0到j的最短路徑。

也就是說,如果路徑 v0--->...--->k--->j 的長度比 v0--->...--->j 更短,則修正v0到j的最短路

徑,將k設定為這條路徑上頂點j的前置頂點

*/if(final[j]==0 && min+g[k][j] < short_path[j])}}

}

dijkstra 演算法理解

求有向圖中乙個源點到其他頂點的最短距離 自己的理解 剛開始的時候相當於有三個集合 v 頂點集合 s 已求得的最短距離頂點集合,假設求a到其他頂點的最短距離 s 剩餘頂點集合 d 儲存的是最短距離值 求一維陣列中的最小值的下標,這個陣列不包含已經求得的頂點 找出最小值下標後,放入到s中,然後求剩餘頂點...

python實現Dijkstra演算法的最短路徑問題

迪傑斯特拉 dijkstra 演算法主要是針對沒有負值的有向圖,求解其中的單一起點到其他頂點的最短路徑演算法。1 演算法原理 迪傑斯特拉 dijkstra 演算法是乙個按照路徑長度遞增的次序產生的最短路徑演算法。下圖為帶權值的有向圖,作為程式中的實驗資料。其中,帶權值的有向圖採用鄰接矩陣graph來...

dijkstra演算法理解 模板

2017 09 17 21 10 45 writer pprp 看了看dijkstra演算法,用自己語言總結一下主要過程吧,首先,明確這個演算法用處是在於計算單源最短路徑問題並且邊權非負,給出乙個起點可以找到其他點的最短路徑 複雜度為o n 2 思想 貪心的做法,每次只看現在的最短路的部分,但是要記...