#include<iostream> #include<cstdio> using namespace std; const int N = 3e5 + 5;
int cnt, d[N], dis[N], sum[N], q1[N], q2[N]; int f1[N], f2[N], len, p1[N], p2[N], root, dim[N]; int head[N], ver[2 * N], net[2 * N], edge[2 * N], idx; bool is[N];
void add(int a, int b, int c) { net[++idx] = head[a], ver[idx] = b, edge[idx] = c, head[a] = idx; }
void dfs1(int u, int fa) { for (int i = head[u]; i; i = net[i]) { int v = ver[i]; if (v == fa) continue; dfs1(v, u); d[v] = edge[i]; if (f1[u] < f1[v] + edge[i]) { p2[u] = p1[u], p1[u] = v; f2[u] = f1[u], f1[u] = f1[v] + edge[i]; } else if (f2[u] < f1[v] + edge[i]) f2[u] = f1[v] + edge[i], p2[u] = v; if (f1[u] + f2[u] > len) root = u, len = f1[u] + f2[u]; } }
void dfs2(int u) { if (p1[u]) dfs2(p1[u]); sum[u] = sum[p1[u]] + d[p1[u]]; dim[++cnt] = u, is[u] = true; if (u == root) { p1[u] = p2[u]; while (p1[u]) { dim[++cnt] = p1[u], is[p1[u]] = true; sum[p1[u]] = sum[u] + d[p1[u]], u = p1[u]; } return; } }
void dfs3(int u, int fa) { for (int i = head[u]; i; i = net[i]) { int v = ver[i]; if (v == fa || is[v]) continue; dfs3(v, u); dis[u] = max(dis[u], dis[v] + edge[i]); } }
int main() { int n, s; scanf("%d%d", &n, &s); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); add(u, v, w), add(v, u, w); } dfs1(1, 0); dfs2(root); for (int i = 1; i <= cnt; i++) dfs3(dim[i], 0); int f1 = 0, t1 = -1, f2 = 0, t2 = -1, ans = 0x3f3f3f3f; for (int i = 1; i <= cnt; i++) { int x = dim[i]; while (f1 <= t1 && sum[x] - sum[q1[f1]] > s) f1++; while (f2 <= t2 && sum[x] - sum[q2[f2]] > s) f2++; while (f2 <= t2 && dis[x] > dis[q2[t2]]) t2--; q1[++t1] = q2[++t2] = x; int d1 = sum[q1[f1]], d2 = sum[dim[cnt]] - sum[q1[t1]]; ans = min(ans, max(dis[q2[f2]], max(d1, d2))); } printf("%d", ans); return 0; }
|