This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "dreaming.h"
#include <bits/stdc++.h>
#ifdef LOCAL
#include "template/debug.hpp"
#else
#define dbg(...) ;
#define timer(...) ;
#endif
template <typename T>
inline bool ckmin(T& x, const T& y) {
return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool ckmax(T& x, const T& y) {
return x < y ? x = y, 1 : 0;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
dbg(N, M, L);
auto merge = [&](int a, int b, int w) {
int left = std::max(a, w + b);
int right = std::max(b, w + a);
return std::min(left, right);
};
std::vector<std::vector<std::pair<int, int>>> adj(N);
for (int i = 0; i < M; i++) {
dbg(A[i], B[i], T[i]);
adj[A[i]].emplace_back(B[i], T[i]);
adj[B[i]].emplace_back(A[i], T[i]);
}
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
std::vector<int> vis(N), comp;
std::vector<int> dp(N);
std::vector<int> up(N);
auto dfs1 = [&](auto self, int u, int p) -> void {
comp.push_back(u);
vis[u] = 1;
dp[u] = 0;
for (auto [v, w] : adj[u]) {
if (v == p) continue;
self(self, v, u);
ckmax(dp[u], dp[v] + w);
}
};
int max_val = 0;
for (int i = 0; i < N; i++) {
if (vis[i]) continue;
auto dfs2 = [&](auto self, int u, int p) -> int {
int lmao = std::max(up[u], dp[u]);
ckmax(max_val, lmao);
std::pair<int, int> good = {0, 0};
for (auto [v, w] : adj[u]) {
if (v == p) continue;
if (w + dp[v] > good.first) {
good.second = good.first;
good.first = w + dp[v];
} else if (w + dp[v] > good.second) {
good.second = w + dp[v];
}
}
for (auto [v, w] : adj[u]) {
if (v == p) continue;
up[v] = w + std::max(up[u], good.first == w + dp[v] ? good.second
: good.first);
ckmin(lmao, self(self, v, u));
}
return lmao;
};
dfs1(dfs1, i, i);
pq.push(dfs2(dfs2, i, i));
}
dbg(max_val);
dbg(pq);
dbg(pq.size());
while (pq.size() > 1) {
auto best1 = pq.top();
pq.pop();
auto best2 = pq.top();
pq.pop();
dbg(best1, best2);
ckmax(max_val, best1 + best2 + L);
pq.push(merge(best1, best2, L));
}
return max_val;
}
# | 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... |