#include <bits/stdc++.h>
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define For(i,a,b) for(int i = a; i <= b; i++)
#define Ford(i,a,b) for(int i = a; i >= b; i--)
#define ll long long
#define ii pair<int,int>
#define fi first
#define se second
#define all(v) v.begin(),v.end()
#define RRH(v) v.resize(unique(all(v)) - v.begin())
using namespace std;
const int N = 300000 + 7;
const int Mod = 1e9 + 7;
const ll INF = (ll)3e18;
const ll BASE = 137;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
long long GetRandom(long long l, long long r) {
return uniform_int_distribution<long long> (l, r)(rng);
}
struct Edge {
int u, v, w;
};
int n, m;
Edge edges[N];
ll dp[2][N];
int Cost[N];
vector<ii> ke[N], adj[N];
int low[N], numt[N];
void solution() {
cin >> n >> m;
For(i,1,m) {
int u, v, w; cin >> u >> v >> w;
ke[u].push_back({v,w});
ke[v].push_back({u,w});
edges[i] = {u,v,w};
}
For(i,1,m+2) Cost[i] = 0;
Ford(i,m,1) {
Cost[i] = max(edges[i].w, Cost[i+1]);
}
For(t,0,1) For(i,1,n) dp[t][i] = INF;
auto Dijkstra = [&](int st, int typ) {
vector<char> vis(n+1, 0);
priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
dp[typ][st] = 0;
pq.push({0, st});
while (!pq.empty()) {
auto cur = pq.top(); pq.pop();
int u = cur.second;
if (vis[u]) continue;
vis[u] = 1;
for (auto &id : ke[u]) {
int v = id.fi, w = id.se;
if (dp[typ][v] > dp[typ][u] + w) {
dp[typ][v] = dp[typ][u] + w;
pq.push({dp[typ][v], v});
}
}
}
};
Dijkstra(1, 0);
Dijkstra(n, 1);
function<int(ll)> check = [&](ll X) -> int {
For(i,1,n) {
vector<ii>().swap(adj[i]);
low[i] = numt[i] = 0;
}
For(i,1,m) {
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
if ((dp[0][u] + dp[1][v] + w < X) || (dp[0][v] + dp[1][u] + w < X)) {
int added = w + Cost[i+1];
adj[u].push_back({v, added});
adj[v].push_back({u, added});
}
}
int time_dfs = 0;
int res = 0;
function<void(int,int)> dfs = [&](int u, int p) {
low[u] = numt[u] = ++time_dfs;
for (auto &ed : adj[u]) {
int v = ed.fi;
ll w = ed.se;
if (v == p) continue;
if (!numt[v]) {
dfs(v, u);
low[u] = min(low[u], low[v]);
if (low[v] == numt[v] && numt[v] <= numt[n]) {
if (dp[0][u] + dp[1][v] + w >= X) res = 1;
}
} else {
low[u] = min(low[u], numt[v]);
}
}
};
dfs(1, 0);
if (!numt[n]) return 1;
return res;
};
ll L = dp[0][n];
if (L >= INF/4) L = INF/4;
ll R = dp[0][n] * 2 + Cost[1];
if (R < L) R = L;
while (L < R) {
ll mid = (L + R + 1) >> 1;
if (check(mid)) L = mid;
else R = mid - 1;
}
cout << L << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
#define TASK ""
if (fopen (".inp", "r")) {
freopen (".inp", "r", stdin);
freopen (".out", "w", stdout);
}
if(fopen(TASK".inp", "r")) {
freopen(TASK".inp", "r", stdin);
freopen(TASK".out", "w", stdout);
}
solution();
cerr << "Time elapsed: " << TIME << " s.\n";
return 0;
}
Compilation message (stderr)
Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:134:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
134 | freopen (".inp", "r", stdin);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:135:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
135 | freopen (".out", "w", stdout);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:138:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
138 | freopen(TASK".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:139:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
139 | freopen(TASK".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |