# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1179493 | azhiraya | Dreaming (IOI13_dreaming) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
//#define endl "\n"
#define fer(i, a, b) for(int i = (a); i <= (b); i ++)
#define LL long long
const int Maxn = 1e5 + 10;
int n, m, k;
struct edge {
int x, v;
};
vector <edge> lbj[Maxn];
int f[Maxn];
int fa[Maxn];
int idx; LL mxd;
LL d[Maxn];
LL ans;
void dfs(int opt, int x) {
f[x] = opt;
if(d[x] >= mxd) {
mxd = d[x];
idx = x;
}
for(auto const &[to, v] : lbj[x]) {
if(f[to] >= opt) continue;
fa[to] = x;
d[to] = d[x] + v;
dfs(opt, to);
}
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
n = N; m = M; k = L;
int x, y, v;
fer(i, 1, m) {
x = A[i - 1]; y = B[i - 1]; v = T[i - 1];
x ++; y ++;
lbj[x].push_back({y, v});
lbj[y].push_back({x, v});
}
vector <LL> g;
fer(i, 1, n) {
if(f[i] == 2) continue;
fa[i] = 0; d[i] = 0; mxd = 0; dfs(1, i);
x = idx;
fa[x] = 0; d[x] = 0; mxd = 0; dfs(2, x);
y = idx;
ans = max(ans, mxd);
LL mn = LONG_LONG_MAX;
for(; y; y = fa[y]) {
mn = min(mn, max(d[y], mxd - d[y]));
}
g.push_back(mn);
}
sort(g.begin(), g.end(), greater <LL>());
if(g.size() >= 3) return max(ans, max(g[0] + g[1] + k, g[1] + g[2] + k + k));
else if(g.size() >= 2) return max(ans, g[0] + g[1] + k);
else if(g.size() >= 1) return max(ans, g[0]);
return 0;
}