dijkstra演算法用來解決單源最短路徑問題
通常來說就是求解乙個圖中兩節點的最短路徑(只適用於正權邊)
該演算法的樸素想法是鬆弛的思想
即若dis ( 1->3 ) = 7
dis ( 1->2 ) = 1
dis ( 2->3 ) = 1
則節點2的存在就可以對1,3鬆弛
在鬆弛完乙個節點之後要選擇尚未進行鬆弛的節點鬆弛,且要選擇距起點距離最近的點
///樸素dijkstra o(n^2+m)
int g[n]
[n];
// 儲存每條邊
int dist[n]
;// 儲存1號點到每個點的最短距離
bool st[n]
;// 儲存每個點的最短路是否已經確定
// 求1號點到n號點的最短路,如果不存在則返回-1
intdijkstra()
if(dist[n]
==0x3f3f3f3f
)return-1
;return dist[n];}
///**是從y總那偷的qaq
///堆優化的dijkstra o(mlogn)
typedef pair<
int,
int> pii;
///改用結構體也可
int n;
// 點的數量
int h[n]
, w[n]
, e[n]
, ne[n]
, idx;
// 鄰接表儲存所有邊
int dist[n]
;// 儲存所有點到1號點的距離
bool st[n]
;// 儲存每個點的最短距離是否已確定
// 求1號點到n號點的最短距離,如果不存在,則返回-1
intdijkstra()
);// first儲存距離,second儲存節點編號
while
(heap.
size()
));}
}}if(dist[n]
==0x3f3f3f3f
)return-1
;return dist[n];}
///**是從y總那偷的qaq
///自己寫的比較順手的dij
#include
using
namespace std;
struct edge
;struct node
} d[
100005];
const
int inf=
0x3f3f3f3f
;vector ve[
100005];
priority_queue qu;
bool vis[
100005];
void
build
(int u,
int v,
int l)
intmain()
for(
int i=
1; i<=n; i++
) d[i]
.l=inf,d[i]
.idx=i;
d[s]
.l=0
; qu.
push
(d[s]);
while
(!qu.
empty()
)}}for
(int i=
1; i<=n; i++
)printf
("%d "
,d[i]
.l);
return0;
}
因為該節點一定無法距起點更近 最短路之dijkstra
覺得這篇博文講的很不錯 click here 下面的 可直接用來ac這道題目 hdu 暢通工程續 click here 乙個用鄰接矩陣存圖的模板。鄰接矩陣存圖主要用於點比較少的 5000個點還是可以的 邊比較多的情況。由於二位陣列不能開過於大,所以這也是鄰接矩陣存圖的限制吧!djk求單源最短路,鄰接...
最短路之dijkstra演算法
dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有 節點的最短路徑。主要特點是 以起始點為中 心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點...
模版 堆優化Dijkstra求最短路
一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...