裸的最短路 spfa 水过 #include<stdio.h> #include<string.h> #include<queue> #define INF 0x3f3f3f3f #define MAXN 10001 using namespace std; struct edge{ int u, v, w, next; }e[MAXN]; int first[MAXN], dist[MAXN], ecnt; bool inq[MAXN]; int t, n, a, b, c; void spfa(){ queue<int> que; memset(inq, false,sizeof(inq)); for(int i = 0; i <= n; ++i) dist[i] = (i == n ? 0 : INF); que.push(n); while(!que.empty()){ int x = que.front(); que.pop(); inq[x] = false; for(int i = first[x]; i != -1; i = e[i].next){ if(dist[e[i].v] - dist[x] > e[i].w){ dist[e[i].v] = dist[x] + e[i].w; if(!inq[e[i].v]){ inq[e[i].v] = true; que.push(e[i].v); } } } } } int main(){ scanf("%d%d",&t, &n); memset(first, -1, sizeof(first)); for(int i = 0, ecnt = 0; i < t; ++i){ scanf("%d%d%d",&e[ecnt].u, &e[ecnt].v, &e[ecnt].w); e[ecnt].next = first[e[ecnt].u]; first[e[ecnt].u] = ecnt; ecnt++; e[ecnt].u = e[ecnt - 1].v; e[ecnt].v = e[ecnt - 1].u; e[ecnt].w = e[ecnt - 1].w; e[ecnt].next = first[e[ecnt].u]; first[e[ecnt].u] = ecnt; ecnt++; } /*from landmark N to landmark 1*/ spfa(); printf("%d/n",dist[1]); return 0; }