1. 程式人生 > >深入理解dijkstra

深入理解dijkstra

無向圖 html 最短路 布爾值 bsp strong 動態 基於 test

深入理解dijkstra

Dijkstra 對於一個有向圖或無向圖,所有邊權為正(邊用鄰接矩陣的形式給出),給定a和b,求a到b的最短路,保證a一定能夠到達b。這條最短路是否一定存在呢?答案是肯定的。相反,最長路就不一定了,由於邊權為正,如果遇到有環的時候,可以一直在這個環上走,因為要找最長的,這樣就使得路徑越變越長,永無止境,所以對於正權圖,在可達的情況下最短路一定存在,最長路則不一定存在。這裏先討論正權圖的最短路問題。 最短路滿足最優子結構性質,所以是一個動態規劃問題。最短路的最優子結構可以描述為: D(s, t) = {Vs ... Vi ... Vj ... Vt}表示s到t的最短路,其中i和j是這條路徑上的兩個中間結點
那麽D(i, j)必定是i到j的最短路,這個性質是顯然的,可以用反證法證明。 基於上面的最優子結構性質,如果存在這樣一條最短路D(s, t) = {Vs ... Vi Vt},其中i和t是最短路上相鄰的點,那麽D(s, i) = {Vs ... Vi} 必定是s到i的最短路。Dijkstra算法就是基於這樣一個性質,通過最短路徑長度遞增,逐漸生成最短路。 Dijkstra算法是最經典的最短路算法,用於計算正權圖的單源最短路(Single Source Shortest Path,源點給定,通過該算法可以求出起點到所有點的最短路),它是基於這樣一個事實:如果源點到x點的最短路已經求出,並且保存在d[x] ( 可以將它理解為D(s, x) )上,那麽可以利用x去更新 x能夠直接到達的點 的最短路。
即: d[y] = min{ d[y], d[x] + w(x, y) } y為x能夠直接到達的點,w(x, y) 則表示x->y這條有向邊的邊權 具體算法描述如下:對於圖G = <V, E>,源點為s,d[i]表示s到i的最短路,visit[i]表示d[i]是否已經確定(布爾值)。 1) 初始化 所有頂點 d[i] = INF, visit[i] = false,令d[s] = 0; 2) 從所有visit[i]為false的頂點中找到一個d[i]值最小的,令x = i; 如果找不到,算法結束; 3) 標記visit[x] = true, 更新和x直接相鄰的所有頂點y的最短路: d[y] = min{ d[y], d[x] + w(x, y) } (第三步中如果y和x並不是直接相鄰,則令w(x, y) = INF)

深入理解dijkstra