對有向圖,無向圖均有效。要求,權值為正。
貪心。每次取距離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中,直到所有頂...