#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxN = 2e5+5;
ll INF = 1e12;
ll sum[maxN];
ll depth[maxN];
vector<vector<pair<ll,ll>>> adj(maxN);
vector<map<ll,ll>> mp(maxN);
ll k,n;
ll ans = INF;
void dfs(int s, int p) {
depth[s] = depth[p]+1;
if(sum[s] <= 3e6) {
if(mp[s][sum[s]] == 0) mp[s][sum[s]] = depth[s];
else mp[s][sum[s]] = min(mp[s][sum[s]], depth[s]);
}
for(auto ps : adj[s]) {
int w = ps.first, u = ps.second;
if(u == p) continue;
sum[u] = sum[s]+w;
dfs(u,s);
if(mp[u].size() > mp[s].size()) swap(mp[u],mp[s]);
for(auto pr : mp[u]) {
int cur = mp[s][k-pr.first + 2*sum[s]];
if(cur != 0) {
ans = min(ans,cur+pr.second - 2*depth[s]);
}
}
for(auto pr : mp[u]) {
mp[s].insert(pr);
}
}
}
int best_path(int N, int K, int H[][2], int L[]) {
n = N;
k = K;
for(int i = 0; i < N-1; i++) {
int a = H[i][0],b = H[i][1], w = L[i];
adj[a].push_back({w,b});
adj[b].push_back({w,a});
}
sum[0] = 0;
depth[0] = -1;
dfs(0,0);
if(ans == INF) return -1;
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... |