最短路演算法 Dijkstra 入門

2022-05-20 13:08:14 字數 2767 閱讀 2116

dijkstra演算法 是一種單源點最短路演算法求出乙個點到其他所有點的最短路。

給你這樣的乙個圖,需要求出1號點到其他點的最短距離是多少。

首先我們開乙個陣列 d[n],d[x] 代表著從起點出發到x點的距離是多少。

開乙個陣列vis[n], vis[x]陣列代表著某個點d[x]是不是成為定值,不會再變小了。

然後我們在開乙個陣列,edge[n][n],edge[a][b] 代表著從a點走到b的路程是多少。

如果不存在 a->b的這條邊,那麼就將他設定為-1。

更新d陣列的條件:d[a] > d[b] + edge[b][a] 的時候更新d[a]的值。

一開始我們將所有距離設定都設定 inf ( inf 意為無窮大)。

當然d[s] = 0;

所以對於剛開始的陣列d來說他的值應該為

圖的狀態應該是

現在我們從1號點出發,圖上存在乙個 1->3的邊 距離為 10  存在乙個1->2的邊 距離為20。

那麼d[3] =  min(d[3], d[1] + edge[1][3]) d[2] = min(d[2], d[1] + edge[1][2])

d陣列即被更新成

其中vis[1] = 1,即這個點不會的距離不會在變小了。

我們掃一遍d陣列,跳過vis[x] == 1的點,找到d[x]最小的點,通過上面的那個陣列我們可以發現,這個點是3,

我們把 vis[3] = 1, 然後再通過3號點出發更新d.

d陣列的值為

然後我們繼續找到d[x]最小的且沒被標記過的點  由上表可知是點2

我們標記點2,然後再用2號點出發,看看有沒有點的距離可以被更新成更小的。

當我們走完2號點的邊的時候,圖就會變成

d陣列的結果為

我們繼續找到d[x]最小的且沒被標記過的點  由上表可知是點4

我們先標記4號點,然後通過點4出發,然後看一下出4號點出發,有沒有點的d會被更新成更小的值

d陣列的結果為

最後沒標記過的點只有5了, 我們從5號點出發,看看有沒有點會繼續被更新。

我們得到最後的圖就變成了

d陣列最後就被更新成了

這樣我們就進行完了dijkstra演算法。

從原點出發到各個點的最短路徑是多少就求出來了。

假設 d[a] < d[b] , 並且存在edge[a][b] , 那麼因為邊edge[a][b] > 0,那麼不可能通過 b 點去更新 a 點, 只可能從a點出發然後到b點,使得d[b]的更小。

因為更新的條件是  d[b] > d[a] + edge[a][b]。 所以只有從d更小的點出發才有可能使得別的點更小。

總結下來的話,就是從原點出發,每次都選出當前距離裡原點最近的點(跳過標記過的點)x,然後從x點出發,遍歷x點的所有邊,看一下是不是存在別的點可以通過點x往外走,使得原點到目標點的距離更小,並且標記一下點x,下次不會再選擇x,因為x已經是最小的了。

每次都確立乙個點,確立完乙個點後需要其訪問所有點去更新距離,總有由n個點

所以 時間複雜度是 n * 2n

來乙個題目:

hdu 2544

1 #include2 #include3 #include4 #include5

using

namespace

std;

6int edge[100+5][100+5];7

int d[100+5];8

bool vis[100+5];9

const

int inf = 0x3f3f3f3f;10

intmain()

1122

for(int i = 2;i <= n;i++)

26 d[1] = 0

;27 vis[1] = 1;28

while (1)39

}40 printf("

%d\n

", d[n]);41}

42return0;

43 }

view code

現在這個是時空複雜度最高的**。

接來下還有關於dijkstra優化的傳送門。

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...

dijkstra最短路演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...

最短路 Dijkstra演算法

這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...