#include <bits/stdc++.h>
// Author: Kazuki_Will_Win_VOI_8703
#define fi first
#define se second
#define pii pair<int, int>
using namespace std;
const int mn = 1e6 + 5, bm = (1 << 20) + 1;
const int inf = 1e9;
int n, k, cnt = 0;
vector <pii> a[mn];
int st[mn], ft[mn], sz[mn], euler[mn], heavy[mn], d[mn], h[mn];
map <int, int> ans;
void txl(int u, int p){
st[u] = ++cnt;
euler[cnt] = u;
sz[u] = 1;
int max_val = 0, heavy_child = 0;
for(auto i : a[u]){
int v = i.fi, w = i.se;
if(v == p) continue;
d[v] = d[u] + 1;
h[v] = h[u] + w;
txl(v, u);
sz[u] += sz[v];
if(sz[v] > max_val){
max_val = sz[v];
heavy_child = v;
}
}
heavy[u] = heavy_child;
ft[u] = cnt;
}
int res = inf;
void dfs(int u, int p, bool keep){
if(h[u] == k) res = min(res, d[u]);
for(auto i : a[u]){
int v = i.fi, w = i.se;
if(v != p && v != heavy[u]) dfs(v, u, false);
}
if(heavy[u]) dfs(heavy[u], u, true);
if(ans[h[u] + k] == 0) ans[h[u] + k] = inf;
res = min(res, ans[h[u] + k] - d[u]);
if(ans[h[u]] == 0) ans[h[u]] = inf;
ans[h[u]] = min(ans[h[u]], d[u]);
for(auto i : a[u]){
int v = i.fi, w = i.se;
if(v != p && v != heavy[u]){
for(int i = st[v]; i <= ft[v]; i++){
int depth = h[euler[i]];
int left = 2 * h[u] + k - depth;
if(ans[left] == 0) ans[left] = inf;
res = min(res, d[euler[i]] + ans[left] - 2 * d[u]);
}
for(int i = st[v]; i <= ft[v]; i++){
if(ans[h[euler[i]]] == 0) ans[h[euler[i]]] = inf;
ans[h[euler[i]]] = min(ans[h[euler[i]]], d[euler[i]]);
}
}
}
if(!keep){
for(int i = st[u]; i <= ft[u]; i++) ans[h[euler[i]]] = inf;
}
}
int best_path(int N, int K, int H[][2], int L[]){
n = N, k = K;
for(int i = 0; i <= n - 2; i++){
int u = H[i][0], v = H[i][1], w = L[i];
++u, ++v;
a[u].push_back({v, w});
a[v].push_back({u, w});
}
txl(1, 0);
dfs(1, 0, true);
if (res > n - 1) res = -1;
return res;
}
# | 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... |