迪傑斯特拉 dijkstra 筆記

2021-10-02 12:15:37 字數 2171 閱讀 8283

dijkstra演算法是用來解決有權圖(無負權)中的最短路問題。

過程:首先我們初始化乙個陣列dis

tdist

dist

將其所有值初始化為無窮,dis

t[i]

dist[i]

dist[i

]表示到i

ii點的最短距離。

然後我們把所有的節點分到兩個集合s與v中,s集合表示已確定最短路的節點的集合,v表示未確定最短路的節點的集合。

1.從起點出發到起點(設為x)的距離是0所以可以確定x一定位於s中

2.接下來我們從起點開始,遍歷x所能到達的下乙個點(設為y),並算出從起點到達這個點的距離並更新dis

tdist

dist

(由於要算的是最短路所以更新的法則是取最小值即dis

t[y]

=min

(dis

t[y]

,dis

t[x]

+len

)dist[y] = min(dist[y],dist[x] + len)

dist[y

]=mi

n(di

st[y

],di

st[x

]+le

n)len是x到y的距離)

3.更新完之後接下,來我們把v中dis

tdist

dist

最小的乙個拉出來,並且加入s然後將其當做x,重複2,3直到v為空。

證明:本人能力有限,希望將來有一天我能將其補上。

板子題

**(樸素版)

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

const ll maxn =

1e3+5;

int graph[maxn]

[maxn]

,m,n;

//dist[i]表示起點到第i個節點的最短距離

//book[i]表示i是否已經確定最小距離

int dist[maxn]

,book[maxn]

;int

dijkstra()

if(dist[n]

!= inf)

return dist[n]

;else

return-1

;}intmain()

cout <<

dijkstra()

<< endl;

return0;

}

堆優化版

這裡可以用乙個優先佇列來代替。每次我們更新的點都是最小的,而每次查詢最小值都需要遍歷查詢,所以我們可以把當前已更新的點放在優先佇列中;

**(堆優化版)

原題

#include

#define eps 1e-8

#define ll long long

#define inf 0x3f3f3f3f

using

namespace std;

//(距離,點)

typedef pair<

int,

int> node;

const ll maxn =

1e6+5;

const ll mod =

1e9+7;

ll h[maxn]

,w[maxn]

,e[maxn]

,nex[maxn]

,cnt =1;

ll n,m,dist[maxn]

,book[maxn]

;void

add(ll from, ll to, ll wth)

void

dijkstra()

);while

(qu.

size()

));}

}}}int

main()

dijkstra()

;if(dist[n]

== inf)

cout <<-1

<< endl;

else

cout << dist[n]

<< endl;

return0;

}

迪傑斯特拉 Dijkstra

參考 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點到其他節點的最短路徑 演算法思路 指定乙個節點,...

Dijkstra 迪傑斯特拉

1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組 第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了 第二組為其餘未確定最短路徑的頂點集合 用u表示 按最短路徑長度的遞增次...

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...