1 struct Edge {
2 int v, w;
3 int next;
4 }edge[MAXM];
5 int head[MAXN], d[MAXN], tot;
6 bool vis[MAXN];
7 void addedge(int u, int v, int w) {
8 edge[tot].v = v;
9 edge[tot].w = w;
10 edge[tot].next = head[u];
11 head[u] = tot++;
12 }
13 void spfa(int s) {
14 queue<int> Q;
15 memset(d, 0x3f, sizeof(d));
16 d[s] = 0;
17 Q.push(s);
18 while(!Q.empty()) {
19 int tmp = Q.front();
20 Q.pop();
21 vis[tmp] = false;
22 for(int i = head[tmp]; i+1; i = edge[i].next) {
23 if(d[edge[i].v] > d[tmp] + edge[i].w) {
24 d[edge[i].v] = d[tmp] + edge[i].w;
25 if(!vis[edge[i].v]) {
26 vis[edge[i].v] = true;
27 Q.push(edge[i].v);
28 }
29 }
30 }
31 }
32 }