# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1185403 | aaa2312 | 경주 (Race) (IOI11_race) | C++20 | 0 ms | 0 KiB |
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const ll mod2 = 998244353;
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
}
ll pow(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1) ans *= a;
b >>= 1;
a *= a;
}
return ans;
}
ll pow(ll a, ll b, ll c) {
ll ans = 1;
while (b) {
if (b & 1) ans = (ans * a) % c;
b >>= 1;
a = (a * a) % c;
}
return ans;
}
void check(bool b) {
if (b)
cout << "Yes\n";
else
cout << "No\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ll n, k;
cin >> n >> k;
vector<vector<pair<ll, ll>>> adj(n);
for (int i = 0; i < n - 1; ++i) {
ll u, v, l;
cin >> u >> v >> l;
adj[u].push_back({v, l});
adj[v].push_back({u, l});
}
vector<ll> dist(n);
vector<ll> depth(n);
function<void(ll, ll)> dfs = [&](ll u, ll p) {
for (auto i: adj[u]) {
if (i.first != p) {
depth[i.first] = depth[u] + 1;
dist[i.first] = dist[u] + i.second;
dfs(i.first, u);
}
}
};
dfs(0, -1);
ll ans = LLONG_MAX;
vector<map<ll, ll>> mp(n);
function<void(ll, ll)> dfs2 = [&](ll u, ll p) {
mp[u][dist[u]] = depth[u];
for (auto &[v, d]: adj[u]) {
if (v != p) {
dfs2(v, u);
if (mp[v].size() > mp[u].size()) {
swap(mp[u], mp[v]);
}
for (auto &[de, mi]: mp[v]) {
if (mp[u].find(dist[u] + k - (de - dist[u])) != mp[u].end()) {
ans = min(ans, mi + mp[u][dist[u] + k - (de - dist[u])] - 2*depth[u]);
}
}
for (auto &[de, mi]: mp[v]) {
if (mp[u].find(de) == mp[u].end()) {
mp[u][de] = mi;
} else {
mp[u][de] = min(mp[u][de], mi);
}
}
}
}
};
dfs2(0, -1);
if (ans == LLONG_MAX) {
cout << -1 << '\n';
} else {
cout << ans << '\n';
}
return 0;
}