| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1314253 | sfsdaf | Race (IOI11_race) | C++17 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define FORN(i, a, b) for(int i = (a); i >= (b); i--)
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()
#define ull unsigned long long
#define pb push_back
#define fi first
#define se second
#define BIT(mask, i) mask & (1 << i)
#define sp(x) setprecision(x) << fixed
const int maxn = 2e5;
int n, tot, k, ans = INT_MAX;
vector<pair<int, int>> g[maxn + 5];
vector<int> min_edge(maxn + 5, INT_MAX);
vector<int> touched;
int num[maxn + 5], del[maxn + 5];
void calc_num(int u, int p){
tot++;
num[u] = 1;
for(auto [v, w] : g[u]){
if(v == p || del[v]) continue;
calc_num(v, u);
num[u] += num[v];
}
}
int find_cen(int u, int p){
for(auto [v, w] : g[u]){
if(v == p || del[v] || num[v] <= tot / 2) continue;
return find_cen(v, u);
}
return u;
}
void dfs_collect(int u, int p, int wei, int dep, vector<pair<int, int>> &deps){
deps.pb({wei, dep});
for(auto [v, w] : g[u]){
if(v == p || del[v]) continue;
dfs_collect(v, u, wei + w, dep + 1, deps);
}
}
void decompose(int u){
tot = 0;
calc_num(u, 0);
int cen = find_cen(u, 0);
del[cen] = 1;
for(auto [v, w] : g[cen]){
if(del[v]) continue;
vector<pair<int, int>> deps;
dfs_collect(v, cen, w, 1, deps);
for(auto [wei, dep] : deps){
if(wei <= k){
ans = min(ans, dep + min_edge[k - wei]);
}
}
for(auto [wei, dep] : deps){
if(wei <= k){
touched.pb(wei);
min_edge[wei] = min(min_edge[wei], dep);
}
}
}
for(auto x : touched) min_edge[x] = INT_MAX;
for(auto [v, w] : g[cen]){
if(del[v]) continue;
decompose(v);
}
}
void solve(){
cin >> n >> k;
FOR(i, 1, n - 1){
int x, y, w; cin >> x >> y >> w;
g[x].pb({y, w});
g[y].pb({x, w});
}
decompose(0);
cout << (ans == INT_MAX ? -1 : ans);
}
signed main(){
if(fopen("input.txt", "r")) freopen("input.txt", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while(t--) solve();
return 0;
}
