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 #include5view codeusing
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 }
現在這個是時空複雜度最高的**。
接來下還有關於dijkstra優化的傳送門。
最短路 Dijkstra演算法
dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...
dijkstra最短路演算法
dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...
最短路 Dijkstra演算法
這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...