#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 10;
int siz[maxN], maxx[maxN];
bitset<maxN> vis;
struct Edge{
int nxt, to, weight;
}e[maxN << 1];
int head[maxN];
int cnt = 0, sum = 0, n, rt;
inline void add_edge(int u, int v, int w) {
e[++cnt]={head[u], v, w};
head[u] = cnt;
}
void dfs1(int u, int fa) {
siz[u] = 1, maxx[u] = 0;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa && !vis[v]) {
dfs1(v, u);
siz[u] += siz[v];
maxx[u] = max(maxx[u], siz[v]);
}
}
if ((maxx[u] = max(maxx[u], sum - siz[u])) < maxx[rt]) {
rt = u;
}
}
int dist[maxN], tot;
pair<int, int> d[maxN];
int ans = 1e9, k;
void dfs2(int u, int fa, int level) {
printf("%d %d %d\n", u, fa, level);
if(level > ans)return;
d[++tot] = {dist[u], level};
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa && !vis[v] && e[i].weight <= k && (dist[v] = dist[u] + e[i].weight) <= k) {
dfs2(v, u, level + 1);
}
}
}
const int inf = (int)4e4 << 4;
set<pair<int, int>> st;
set<pair<int, int>>::iterator it;
void dfs(int u, int fa) {
st.insert({0, 0});
vis[u] = true;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa && !vis[v]) {
dist[v] = e[i].weight;
dfs2(v, rt, 1);
for (int idx = 1; idx <= tot; idx++) {
it = st.lower_bound(make_pair(k - d[idx].first, 0));
if (it != st.end() && it->first + d[idx].first == k)
ans = min(ans, it->second + d[idx].second);
}
for (int idx = 1; idx <= tot; idx++)
st.insert(d[idx]);
tot = 0;
}
}
st.clear();
for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (!vis[v]) dfs(v, u); }
}
int main() {
cin >> n >> k;
for (int i = 1, a, b, c; i < n; i++) {
cin >> a >> b >> c;
add_edge(a, b, c), add_edge(b, a, c);
}
rt = 0, maxx[rt] = inf, sum = n;
dfs1(1, -1); dfs2(rt, -1, 1); dfs(rt, -1);
cout << (ans == 1e9 ? -1 : ans);
printf("%.2lf", (double(clock()) / CLOCKS_PER_SEC));
return 0;
}
通过调试发现,应该是重心找错了。求助/kk