Link to this code:
https://cses.fi/paste/f5dd19d5b60c0e65f99f84//**
* author: TomDev - Tran Hoang Quan
* created: 2026-02-24 00:13:23
* country: Vietnam - VNM
* ----------------------------------------------------------
* title: High Score Dijkstra
* source:
* submission:
* status: WIP
* ----------------------------------------------------------
* tags:
* complexity:
* note:
**/
#include <iostream>
#include <vector>
#include <cstdio>
#include <utility>
#include <cstring>
#include <queue>
#include <bitset>
#if __has_include("debuggingz.h")
#include "debuggingz.h"
#define dbg(x,i) cerr << "BreakPoint(" << i << ") -> " << #x << " = " << (x) << '\n';
#else
#define dbg(x,i)
#endif
using namespace std;
#define all(x,bonus) (x).begin()+(bonus),(x).end()
#define rall(x,bonus) (x).rbegin(),(x).rend()-(bonus)
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);
#define fi first
#define se second
#define eb emplace_back
#define sz(x) (int)(x).size()
using ll = long long;
using ld = long double;
using pll = pair<long long,long long>;
using pld = pair<long double,long double>;
using ull = unsigned long long;
using pii = pair<int,int>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vll = vector<long long>;
using vvll = vector<vector<long long>>;
void setup(){
if(!fopen("NAME.INP", "r")) return;
freopen("NAME.INP", "r", stdin);
freopen("NAME.OUT", "w", stdout);
}
// ----------------------- [ CONFIG & CONSTANTS ] -----------------------
const int N = 2502;
int n,m;
struct node{
int u;
ll w;
node(int _u = 0, ll _w = 0) : u(_u), w(_w) {};
bool operator<(const node& other) const{
return w > other.w;
}
};
vector<node> adj[N], adj2[N];
ll dis[N];
int cnt[N];
bitset<N> vis1,vis2;
// ----------------------- [ FUNCTIONS ] -----------------------
void dijkstra(int src){
dis[src] = 0;
priority_queue<node> pq;
pq.push({src,0});
cnt[src] = 1;
while(!pq.empty()){
node u = pq.top();
pq.pop();
if(u.w > dis[u.u]) continue;
for(node v : adj[u.u]){
if(!vis1[v.u] || !vis2[v.u]) continue;
if(dis[v.u] > dis[u.u] + v.w){
dis[v.u] = dis[u.u] + v.w;
cnt[v.u]++;
if(cnt[v.u] > n){
dis[n] = 1;
return;
}
pq.push({v.u,dis[v.u]});
}
}
}
}
void dfs1(int u){
vis1[u] = 1;
for(node v : adj[u]){
if(!vis1[v.u]) dfs1(v.u);
}
}
void dfs2(int u){
vis2[u] = 1;
for(node v : adj2[u]){
if(!vis2[v.u]) dfs2(v.u);
}
}
// ----------------------- [ MAIN ] -----------------------
int main(){
fastio;
setup();
memset(dis,0x3f,sizeof(dis));
cin >> n >> m;
for(int i = 1; i <= m; i++){
int u,v;
ll w;
cin >> u >> v >> w;
adj[u].eb(v,-w);
adj2[v].eb(u,-w);
}
dfs1(1);
dfs2(n);
dijkstra(1);
cout << -dis[n];
}