#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define pb push_back
#define ar array
template <typename A, typename B>
bool chmin(A &a, const B &b) {
if(a > b) {
return a = b, true;
}
return false;
}
template <typename A, typename B>
bool chmax(A &a, const B &b) {
if(a < b) {
return a = b, true;
}
return false;
}
int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
vector<vector<ar<int, 2>>> adj(n);
// cout << n << ' ' << m << ' ' << l << endl;
for(int i = 0; i < m; i++) {
// cout << i << endl;
adj[A[i]].pb({B[i], T[i]});
adj[B[i]].pb({A[i], T[i]});
}
vector<int> used(n), mx(n), mx2(n), d(n);
auto dfs = [&](auto &&self, int v) -> void {
used[v] = true;
mx[v] = d[v];
for(auto [to, w] : adj[v]) {
if(used[to]) continue;
d[to] = d[v] + w;
self(self, to);
chmax(mx2[v], mx[to]);
if(mx2[v] > mx[v]) swap(mx2[v], mx[v]);
}
};
for(int i = 0; i < n; i++) {
// cout << i << endl;
if(!used[i]) {
dfs(dfs, i);
}
}
fill(all(used), false);
vector<int> mx_root(n);
int mn = 1e9, ver = -1;
auto dfs2 = [&](auto &&self, int v) -> void {
used[v] = true;
int res = max(mx_root[v], mx[v] - d[v]);
if(chmin(mn, res)) ver = v;
for(auto [to, w] : adj[v]) {
if(used[to]) continue;
chmax(mx_root[to], mx_root[v] + w);
int val = mx[v];
if(val == mx[to]) val = mx2[v];
chmax(mx_root[to], (val - d[v]) + w);
self(self, to);
}
};
auto nadj = adj;
vector<ar<int, 2>> b;
for(int i = 0; i < n; i++) {
if(!used[i]) {
mn = 1e9;
ver = -1;
dfs2(dfs2, i);
b.pb({mn, ver});
}
}
sort(all(b), greater<>());
for(int i = 1; i < (int)b.size(); i++) {
nadj[b[0][1]].pb({b[i][1], l});
nadj[b[i][1]].pb({b[0][1], l});
}
fill(all(mx), 0);
fill(all(mx2), 0);
fill(all(d), 0);
fill(all(mx_root), 0);
fill(all(used), false);
int ans = 0;
auto ndfs = [&](auto &&self, int v) -> void {
used[v] = true;
mx[v] = d[v];
for(auto [to, w] : nadj[v]) {
if(used[to]) continue;
d[to] = d[v] + w;
self(self, to);
chmax(mx2[v], mx[to]);
if(mx2[v] > mx[v]) swap(mx2[v], mx[v]);
}
};
ndfs(ndfs, 0);
fill(all(used), false);
auto ndfs2 = [&](auto &&self, int v) -> void {
used[v] = true;
int res = max(mx_root[v], mx[v] - d[v]);
chmax(ans, res);
for(auto [to, w] : nadj[v]) {
if(used[to]) continue;
chmax(mx_root[to], mx_root[v] + w);
int val = mx[v];
if(val == mx[to]) val = mx2[v];
chmax(mx_root[to], (val - d[v]) + w);
self(self, to);
}
};
ndfs2(ndfs2, 0);
return ans;
}
| # | 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... |