rt,代码如下(加快读快输都不行)。
#include<bits/stdc++.h>
using namespace std;
const int N = 5000 + 10;
int n, m, d[N], sec[N];
struct edge{int v, w;};
vector<edge> g[N];
priority_queue<pair<int, int> > q;
void dijkstra(int s){
for(int i=1;i<=n;i++) d[i] = sec[i] = 2000000000;
d[s] = 0;
q.push(make_pair(0, s));
while(!q.empty()){
int u = q.top().second;
q.pop();
for(int i=0;i<g[u].size();i++){
int v = g[u][i].v, w = g[u][i].w;
if(d[u] + w < d[v]){
d[v] = d[u] + w;
q.push(make_pair(d[v], v));
}else if(d[v] < d[u] + w && d[u] + w < sec[v]){
sec[v] = d[u] + w;
q.push(make_pair(d[v], v));
}else if(sec[v] > sec[u] + w){
sec[v] = sec[u] + w;
q.push(make_pair(d[v], v));
}
}
}
}
int main(){
scanf("%d%d", &n, &m);
for(int i=1;i<=m;i++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u].push_back((edge){v, w});
g[v].push_back((edge){u, w});
}
dijkstra(1);
printf("%d\n", sec[n]);
return 0;
}