堆優化把所有dish[i]放在優先佇列中,取堆頂dist[u]最小值更新
#include
#include
#include
#define maxn 100001
#define maxm 400001
using namespace std;
struct e };
int n,m,s,v[maxm]
,next[maxm]
,head[maxn]
,w[maxm]
,dis[maxn]
,tot;
inline
void
insert
(int x,
int y,
int z)
priority_queueq;
inline
void
dijkstra()
);while
(!q.
empty()
));}
}}intmain()
配對堆優化
#include
#include
#include
#define inf 10000000000000000ll
#include
using namespace std;
typedef pair<
long
long
,int
> pii;
//priority_queue , greater> q;
using namespace __gnu_pbds;
typedef __gnu_pbds:
:priority_queue
, pairing_heap_tag > heap;
heap:
:point_iterator id[
1000005];
struct node
a[10000005];
int tot, n, m, s;
long
long dis[
1000005];
int rp, t, first[
1000005];
void
addedge
(int st,
int end,
int val)
intdij
(int s)}}
}int
main()
dij(s)
;for
(int i =
1; i <= n ; i++
)printf
("%d "
,dis[i]);
printf
("\n");
}
zkw線段樹優化
如果t[1]!=max,說明還有可以優化的dist,往下找到最小的dist進行更新
#include
#include
#include
#include
using namespace std;
const
int maxn=
1e5+1;
const
int maxm=
2e5+1;
template
inline
void
read
(t& t)
int n,m,s,m=
1,v[maxm]
,next[maxm]
,w[maxm]
,head[maxn]
,d[maxn]
,t[262145];
inline
voidu(
int x,
int p)
inline
intf()
intmain()
}for
(int i=
1;i<=n;i++
)printf
("%d "
,d[i]);
printf
("\n");
return0;
}
模版 堆優化Dijkstra求最短路
一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...
Dijkstra求最短路(樸素and堆優化)
題目來自acwing 題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸出格式...
最短路之dijkstra及其堆優化
dijkstra演算法用來解決單源最短路徑問題 通常來說就是求解乙個圖中兩節點的最短路徑 只適用於正權邊 該演算法的樸素想法是鬆弛的思想 即若dis 1 3 7 dis 1 2 1 dis 2 3 1 則節點2的存在就可以對1,3鬆弛 在鬆弛完乙個節點之後要選擇尚未進行鬆弛的節點鬆弛,且要選擇距起點...