#include #include #include #include #include using namespace std; const int N = 3e4 + 5, N3 = 15e4 + 5, inf = 0x3f3f3f3f; int to[N3], ne[N3], w[N3], h[N], cnt = 0, s = N - 4, e, dist[N]; bool in[N], wa = 0; int u, v, w1;//WA 和bool放一起了 int n, m, maxn = 0; void add(int u, int v, int w1) { to[++cnt] = v; ne[cnt] = h[u]; w[cnt] = w1; h[u] = cnt; } void spfa(int s) { memset(dist,0x3f,sizeof dist);//更好的賦初值方法 dist[s] = 0;//和賦inf顺序反了=白干 stack q; // queue没有自带函数清零 q.push(s); while (!q.empty()) { u = q.top(); q.pop(); in[u] = 0; // spfa的精髓!! for (int i = h[u]; i; i = ne[i]) { v = to[i], w1 = w[i]; // printf("%d %d %d\n",u,v,w1); if (dist[u] + w1 < dist[v]) { dist[v] = dist[u] + w1; // printf("%d(%d) %d(%d) %d\n",u,dist[u],v,dist[v],w1); if (!in[v]) { q.push(v); in[v] = 1; } } } } } int main() { scanf("%d%d", &n, &m); // for (int i = 0; i <= n; i++) // { // dist[i] = inf; // } for (int i = 1; i <= m; i++) // n,m不分 { scanf("%d%d%d", &u, &v, &w1); add(u, v, w1); } spfa(1); // maxn = 0; // for(int i=2;i<=n;i++) // { // if(dist[i]>maxn) // { // maxn=dist[i]; // } // } printf("%d", dist[n]); return 0; }