# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1281071 | dora_kyu | Race (IOI11_race) | C++17 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n, k;
#define st first
#define nd second
const int maxn = 2e5 +5;
const int inf = 1e9 + 5;
vector<pair<int,int>> a[maxn];
int sl[maxn];
int del[maxn];
#define room(v, x) for(auto &v : x)
void dfs(int u, int p)
{
sl[u] = 1;
room(v, a[u])
{
if(v.st == p || del[v.st]) continue;
dfs(v.st, u);
sl[u] += sl[v.st];
}
}
int decom(int u, int p, int sz)
{
room(v, a[u])
{
if(v.st == p || del[v.st]) continue;
if(sl[u] > sz / 2) return decom(v.st, u, sz);
}
return u;
}
int ans = inf;
int nmax = 0;
int cnt[maxn * 10];
bool f[maxn * 10];
vector<int> fix;
void dfses(int u, int p, int len, int road, bool al)
{
if(road > k) return;
//if(cnt[road] == 0 && road != 0) cnt[road] = inf;
//if(cnt[k-road] == 0 && k != road) cnt[k-road] = inf;
if(!f[road]){f[road] = true; fix.push_back(road); }
nmax = max(nmax, road);
if(al) cnt[road] = min(cnt[road], len);
else ans = min(ans , len + cnt[k-road]);
room(v, a[u])
{
if(v.st == p || del[v.st]) continue;
dfses(v.st , u, len + 1, road + v.nd, al);
}
}
void update(int u)
{
nmax = 0;
cnt[0] = 0;
room(v, a[u])
{
if(del[v.st]) continue;
dfses(v.st, u, 1, v.nd, false);
dfses(v.st ,u, 1, v.nd, true);
}
while(!fix.empty())
{
f[fix.back()] = false;
cnt[fix.back()] = inf;
fix.pop_back();
}
}
void tak(int u)
{
dfs(u,u);
int rot = decom(u,u,sl[u]);
update(rot);
del[rot] = 1;
for(auto & v : a[rot])
{
if(del[v.st]) continue;
tak(v.st);
}
}
signed main()
{
cin.tie(nullptr) -> ios_base::sync_with_stdio(0);
cin >> n >> k;
// fill(cnt + 1, cnt + 10 * maxn, inf);
// cerr << cnt[2] << endl;
fill(cnt, cnt + maxn * 10, inf);
// cerr << cnt[2] << endl;
for(int i = 1; i < n; ++i)
{
int u, v, l; cin >> u >> v >> l;
a[u].push_back({v,l});
a[v].push_back({u,l});
}
tak(1);
if(ans == inf) ans = -1;
cout << ans << endl;
}