堆优化的dij【模板】
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 int head[1000005],n, m, cnt, ccnt; 7 long long dist[1000005],ans; 8 struct pot { 9 int id; 10 int val; 11 bool operator<(const struct pot&aa)const { 12 return val > aa.val; 13 } 14 }; 15 struct edge { 16 int fr; 17 int to; 18 long long v; 19 int next; 20 }e[1000005]; 21 void INIT() { 22 memset(head, -1, sizeof(head)); 23 memset(dist, 0x3f3f3f3f, sizeof(dist)); 24 dist[1] = 0; 25 cnt=0; 26 ans = 0; 27 } 28 void adde(int xx, int yy,long long zz) { 29 e[cnt].fr = xx; 30 e[cnt].to = yy; 31 e[cnt].v = zz; 32 e[cnt].next = head[xx]; 33 head[xx] = cnt++; 34 } 35 void dij() { 36 priority_queue<struct pot>pq; 37 struct pot sta; 38 sta.id = 1; 39 sta.val = 0; 40 pq.push(sta); 41 while (!pq.empty()) { 42 struct pot aa = pq.top(); pq.pop(); 43 if (dist[aa.id] < aa.val)continue; 44 for (int i = head[aa.id]; i != -1; i = e[i].next) { 45 if (dist[e[i].to] > dist[aa.id] + e[i].v) { 46 dist[e[i].to] = dist[aa.id] + e[i].v; 47 struct pot cc; 48 cc.id = e[i].to; 49 cc.val = dist[e[i].to]; 50 pq.push(cc); 51 } 52 } 53 } 54 } 55 int main() { 56 int t; 57 scanf("%d",&t); 58 while (t--) { 59 INIT(); 60 scanf("%d%d", &n, &m); 61 while (m--) { 62 int x, y; 63 long long z; 64 scanf("%d%d%lld", &x, &y, &z); 65 adde(x, y, z); 66 } 67 dij(); 68 } 69 return 0; 70 }