dij WA on#3#11
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
struct Node {
int d, l;
bool operator>(const Node &a) const {
return l > a.l;
}
};
priority_queue<Node, vector<Node>, greater<Node>> q;
int dis[5005];
bool vis[5005];
int sdis[5005];
vector<int> head[10005];
struct Edge {
int w, to;
};
vector<Edge> e[5005];
void addEdge(int u, int v, int w) {
e[u].push_back({w, v});
e[v].push_back({w, u});
}
int n, m;
int main() {
cin >> n >> m;
int u, v, w;
memset(dis, 0x7f, sizeof(dis));
memset(sdis, 0x7f, sizeof(sdis));
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; ++i) {
cin >> u >> v >> w;
addEdge(u, v, w);
}
dis[1] = 0;
q.push({1, 0});
while (!q.empty()) {
Node tmp = q.top();
q.pop();
int u = tmp.d;
if (vis[u]) continue;
vis[u] = true;
for (Edge edge : e[u]) {
int tw = edge.w;
int t = edge.to;
if (dis[t] > dis[u] + tw) {
sdis[t] = dis[t];
dis[t] = dis[u] + tw;
q.push({t, dis[t]});
}
if (dis[u] + tw > dis[t] && dis[u] + tw < sdis[t]) {
sdis[t] = dis[u] + tw;
q.push({t, sdis[t]});
}
if (sdis[u] + tw < sdis[t] && sdis[u] + tw > dis[t]) {
sdis[t] = sdis[u] + tw;
q.push({t, sdis[t]});
}
}
}
cout << sdis[n] << endl;
return 0;
}