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 <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
#define pb push_back
#define mp make_pair
const int MAXN = 200005, INF = 0x3f3f3f3f;
int N, K, H[MAXN][2], L[MAXN];
int sz[MAXN];
map<int, int> best;
bool done[MAXN];
vector<pii> adj[MAXN];
queue<pii> ar;
int ans = INF, target;
void dfs (int u, int p){
sz[u]=1;
for (pii e: adj[u]){
if (e.first==p||done[e.first]) continue;
dfs(e.first, u);
sz[u]+=sz[e.first];
}
}
int centroid (int u, int p, int S){
for (pii e: adj[u]){
if (sz[e.first]*2>S&&e.first!=p&&!done[e.first]) return centroid(e.first, u, S);
}
return u;
}
void path (int u, int p, int length, int cnt){
if (length==target) ans = min(ans, cnt);
else{
ar.push(mp(length, cnt));
if (best[target-length]!=0) ans = min(ans, best[target-length]+cnt);
}
for (pii e: adj[u]){
if (e.first!=p&&!done[e.first]) path (e.first, u, length+e.second, cnt+1);
}
}
void solve(int u){
dfs(u, -1);
u = centroid(u, -1, sz[u]);
//cout<<u<<endl;
best.clear();
done[u] = true;
for (pii e: adj[u]){
if (done[e.first]) continue;
path (e.first, u, e.second, 1);
while (!ar.empty()){
pii p = ar.front();
ar.pop();
if (best[p.first]==0) best[p.first] = p.second;
else best[p.first] = min(best[p.first], p.second);
}
}
for (pii e: adj[u]){
if(!done[e.first]) solve(e.first);
}
}
int best_path(int N, int K, int H[][2], int L[]){
target = K;
for (int i = 0; i<N-1; i++){
adj[H[i][0]].pb(mp(H[i][1], L[i]));
adj[H[i][1]].pb(mp(H[i][0], L[i]));
}
solve (0);
return ans==INF?-1:ans;
}
/*
int main()
{
cin>>N>>K;
for (int i = 0; i<N-1; i++){
scanf("%d%d%d", &H[i][0], &H[i][1], &L[i]);
}
cout<<best_path(N, K, H, L);
}*/
# | 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... |