# Dijkstra模板

 1 #include <bits/stdc++.h>
2 #define For(i,j,k) for(int i=j;i<=k;i++)
3 #define Dow(i,j,k) for(int i=j;i>=k;i--)
4 #define LL long long
5 using namespace std ;
7     int x = 0, f = 1;
8     char ch = getchar();
9     while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
10     while(ch>='0'&&ch<='9') { x = x * 10+ch-48; ch = getchar(); }
11     return x * f;
12 }
13 inline void write(LL x) {
14     if( x < 0 ) putchar('-');
15     if( x > 9 ) write(x/10);
16     putchar(x%10+48);
17 }
18 const int N = 10011, M = 500011;
19 const LL INF = 1e16;
20 int n, m, S, nedge;
22 LL dist[N];
23 struct edge{
24     int to, pre, val;
25 }e[M];
26 struct node{
27     int id;
28     LL val;
29     friend bool operator <(node a, node b) {
30         return a.val > b.val;
31     }
32 };
33 priority_queue<node> Q;
34 inline void add(int x, int y, int v) {
35     e[++nedge] = (edge){y, head[x], v};
37 }
38 void Dijkstra(int S) {
39     For(i, 0, n) dist[i] = INF;
40     For(i, 0, n) vis[i] = 0;
41     dist[S] = 0;
42     while(!Q.empty()) Q.pop();
43
44     Q.push((node){S, 0});
45     while(!Q.empty()) {
46         node p = Q.top(); Q.pop();
47         int u = p.id;
48         if(vis[u]) continue;
49         vis[u] = 1;
50         for(int i=head[u]; i; i=e[i].pre) {
51             int v = e[i].to;
52             if(dist[u]+e[i].val < dist[v]) {
53                 dist[v] = dist[u]+e[i].val;
54                 Q.push((node){v, dist[v]});
55             }
56         }
57     }
58 }
59
60 int main() {
62     For(i, 1, m) {
71 }