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;
using ll = long long;
const int N = 1e6+5;
const int maxn=2e5+5;
int cnt[N],ans = 1e9;
int sub[maxn],k;
bool done[maxn];
vector<int>v;
vector<pair<int,int>>E[maxn];
void dfs(int nd,int pr){
sub[nd] = 1;
for(auto i : E[nd]) if(i.first != pr and !done[i.first]) dfs(i.first,nd), sub[nd] += sub[i.first];
}
int cent(int nd){
int sz = sub[nd];
while(1){
pair<int,int>mx = {0,0};
for(auto i : E[nd]){
if(!done[i.first] and sub[i.first] < sub[nd] and sub[i.first] > mx.first) mx = {sub[i.first],i.first};
}
if(mx.first * 2 <= sz) return nd;
nd = mx.second;
}
}
void calc(int nd,int pr,int lvl,ll ds){
if(ds <= k){
assert(k-ds < N and k-ds >= 0);
ans = min(ans,cnt[k-ds] + lvl);
}
for(auto i : E[nd])
if(i.first != pr and !done[i.first]) calc(i.first,nd,lvl+1,ds+i.second);
}
void put(int nd,int pr,int lvl,ll ds){
if(ds <= k){
assert(ds < N and ds >= 0);
cnt[ds] = min(cnt[ds],lvl);
v.push_back(ds);
}
for(auto i : E[nd])
if(i.first != pr and !done[i.first]) put(i.first,nd,lvl+1,i.second+ds);
}
void f(int nd){
dfs(nd,-1);
int cen = cent(nd);
done[cen] = 1;
sub[cen] = sub[nd];
// cout<<cen<<' ';
for(auto i : E[cen]){
if(!done[i.first]){
// if(cen == 1) cout<<i.first<<' ';
calc(i.first,cen,1,i.second);
put(i.first,cen,1,i.second);
}
}
for(auto i : v) cnt[i] = 1e9;
v.clear();
for(auto i : E[cen])
if(!done[i.first]) f(i.first);
}
int best_path(int n,int K,int h[][2],int l[]){
k = K;
for(int i = 0;i < n-1;i++){
E[h[i][0]].push_back({h[i][1],l[i]});
E[h[i][1]].push_back({h[i][0],l[i]});
}
for(int i = 1;i < N;i++) cnt[i] = 1e9;
f(0);
// cout<<'\n';
if(ans == 1e9) ans = -1;
return ans;
}
// int main(){
// ios::sync_with_stdio(false);
// cin.tie(0);
// int n,k;
// cin >> n >> k;
// int H[n-1][2],L[n-1];
// for(int i = 0;i < n-1;i++) cin >> 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... |