dijkstra演算法理解 模板

2022-03-16 12:57:42 字數 1239 閱讀 9550

2017-09-17 21:10:45

writer:pprp

看了看dijkstra演算法,用自己語言總結一下主要過程吧,

首先,明確這個演算法用處是在於計算單源最短路徑問題並且邊權非負,給出乙個起點可以找到其他點的最短路徑

複雜度為o(n^2)

思想:貪心的做法,每次只看現在的最短路的部分,但是要記得更新已確定該點到其他點的距離

總結一下,dijkstra的做法:

需要 dis vis map 三個陣列

給出起點就可以找到到其他所有點的最短路

1、初始化dis陣列和起點的dis和vis

2、進行n個點的n次迴圈

3、從起點開始,找到距離最短的點

4、然後將其dis和vis更改,

5、更改該點相連的其他點的距離

模板如下:

const

int maxn = 1010

;const

int inf = 0x3f3f3f3f

;int

mp[maxn][maxn];

bool

vis[maxn];

intdis[maxn];

void dijkstra(int

st) vis[st] = 1

; dis[st] = 0

;

int rec = -1

;

for(int i = 1 ; i < n ; i++)//

起到了迴圈的作用

}if(rec == -1)return

; vis[rec] = 1

;

for(int j = 1; j <= n; j++)//

更新該點連線到的其他的點

}}

使用方法:

for(int i = 0 ; i < maxn; i++)

for(int j = 0 ; j < maxn; j++)

mp[i][j] =inf;

memset(vis,

0,sizeof

(vis));

for(int i = 0 ; i < t ; i++)

dijkstra(n);

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

cout

<< dis[i] << "";

cout

<< endl;

dijkstra 演算法理解

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

三分演算法 理解,模板

三分模板以前也用過,就是沒怎麼想過具體的。今天看了一些博文,寫一些自己的東西。一.適用於上凸或下凸曲線 比如開口向上或者向下的拋物線 可以確定曲線的最值。二.複雜度 o 2log3n 比二分慢一點。三.具體實現 1.最大值 l 左邊界 r 右邊界 mid l r 2 midmid r mid 2 i...

A 演算法理解

廣度優先 bfs 和深度優先 dfs 搜尋 深度優先搜尋,用俗話說就是不見棺材不回頭。演算法會朝乙個方向進發,直到遇到邊界或者障礙物,才回溯。一般在實現的時候,我們採用遞迴的方式來進行,也可以採用模擬壓棧的方式來實現。如下圖,s代表起點,e代表終點。我們如果按照右 下 左 上這樣的擴充套件順序的話,...