RT,求助神犇!
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
struct node {
int to, nxt, w;
} edge[200002];
int head[5002], tot, dist1[5002], dist2[5002];
bool vis[5002], flag;
void add (int from, int to, int w) {
edge[++tot].nxt = head[from];
edge[tot].to = to;
edge[tot].w = w;
head[from] = tot;
}
priority_queue<PII, vector<PII>, greater<PII> > q;
int main () {
memset(dist1, 0x3f, sizeof(dist1));
memset(dist2, 0x3f, sizeof(dist2));
int n, r, u, v, w, x;
scanf("%d%d", &n, &r);
for (int i = 1; i <= r; i++) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
dist1[1] = 0;
q.push(make_pair(0, 1));
while (!q.empty()) {
x = q.top().second, q.pop();
if (vis[x]) continue;
vis[x] = true;
for (int i = head[x]; i; i = edge[i].nxt) {
flag = false;
if (dist1[x] + edge[i].w < dist1[edge[i].to]) {
flag = true;
dist1[edge[i].to] = dist1[x] + edge[i].w;
}
if (dist1[x] + edge[i].w > dist1[edge[i].to] && dist1[x] + edge[i].w < dist2[edge[i].to]) {
flag = true;
dist2[edge[i].to] = dist1[x] + edge[i].w;
}
if (dist2[x] + edge[i].w < dist2[edge[i].to]) {
flag = true;
dist2[edge[i].to] = dist2[x] + edge[i].w;
}
if (flag) q.push(make_pair(dist1[edge[i].to], edge[i].to));
}
}
printf("%d", dist2[n]);
return 0;
}
悬关