普通版本
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <limits.h>
const int INF = 0x3f3f3f3f;
const int MAXN = 100010;
const int MAXM = 500050;
using namespace std;
struct Edge {
int to, next, w;
Edge(const int & _to = int(), const int & _next = int(), const int & _w = int()) : to(_to), next(_next), w(_w) {}
} edge[MAXM];
int dist[MAXN];
int visit[MAXN];
int head[MAXN];
int cnt;
void spfa(const int & st) {
dist[st] = 0;
queue<int> q;
q.push(st);
visit[st] = 1;
while (!q.empty()) {
int x = q.front();
q.pop();
visit[x] = 0;
for (int i = head[x]; i;i = edge[i].next) {
int y = edge[i].to;
if (dist[y] > dist[x] + edge[i].w) {
dist[y] = dist[x] + edge[i].w;
if (!visit[y]) {
q.push(y);
visit[y] = 1;
}
}
}
}
}