最短路 Dijkstra演算法

2021-07-31 03:15:59 字數 1472 閱讀 5954

對有向圖,無向圖均有效。要求,權值為正。

貪心。每次取距離s最近的點,來更新其他點。

bfs。將權值看成單位長度的路徑之和,最近的點即bfs最先達到的點。

定義delta(u,v),若u,v不可達,值為無窮。若u,v可達,則delta(u,v) 即u,v間最短距離。

鬆弛操作:

relax(u,v,w)

if d[u] > d[v] + w(u,v)

then d[u] = d[v] + w(u,v)

parent[v] = u

#include

#include

#include

#include

using

namespace

std;

const

intmaxn =

10005;

const

intinf =

1<< 20;

struct

edge;

typedef

pair

<

int,

int> pr;

// delta[i] i

intd[maxn

];//初始化為無限,依次更新,至達到delta(u)。//類似並查集中f[x] 和 find(int x)的關係,需要更新。//不同的是並查集find(x)需要通過f[x]來得到,f[x]的值可能是該樹根節點,也可能只是該樹x節點的某個祖先。而d[u]一開始被初始化為inf,通過遍歷更新,可以證明,最後可以達到真實值,即delta(u),而在中間過程,不一定為最小值delta(u)

void

dijkstra(

ints,

intn,

vector

<

edge

> mp[

maxn])

d[s] =0;

priority_queue

vector

<

pr>,

greater

<

pr> >pq;

pq.push(pr

); while

(!pq.

empty

()) );//bfs}

} }

} }int

main()

inta,b,c;

vector

<

edge

> mp[

maxn

];// u v w

for(int

i =0

; i < m; i ++) );

mp[b].

push_back

(edge);

} dijkstra(1

, n, mp);

cout

<<

d[n] <<

endl;

} return0;

}

最短路 Dijkstra演算法

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

dijkstra最短路演算法

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

最短路 Dijkstra演算法

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