vector<Edge> adj[MAXN]; int dist[MAXN], pre[MAXN]; int diameter[MAXN], dlen; int f[MAXN][MAXN]; // f[i][j] = min distance from node i to diameter segment [0,j] int n, s;
voiddfs(int u, int p, int d){ dist[u] = d; pre[u] = p; for (auto& e : adj[u]) { if (e.to != p) { dfs(e.to, u, d + e.w); } } }
int res = start, maxd = 0; for (int i = 1; i <= n; i++) { if (dist[i] > maxd) { maxd = dist[i]; res = i; } } return res; }
voidbuildDiameter(){ int u = getFarthest(1); int v = getFarthest(u);
dlen = 0; int cur = v; while (cur != -1) { diameter[dlen++] = cur; cur = pre[cur]; } reverse(diameter, diameter + dlen); }
intgetDistance(int u, int v){ memset(dist, 0x3f, sizeof(dist)); dfs(u, -1, 0); return dist[v]; }
intmain(){ scanf("%d %d", &n, &s);
for (int i = 0; i < n - 1; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); adj[u].push_back({v, w}); adj[v].push_back({u, w}); }
buildDiameter();
// 预处理:计算每个点到直径上每个点的距离 int g[MAXN][MAXN]; for (int i = 0; i < dlen; i++) { memset(dist, 0x3f, sizeof(dist)); dfs(diameter[i], -1, 0); for (int j = 1; j <= n; j++) { g[j][i] = dist[j]; } }
// 计算直径上相邻点的距离 int segLen[MAXN] = {0}; for (int i = 1; i < dlen; i++) { segLen[i] = segLen[i-1] + getDistance(diameter[i-1], diameter[i]); }
int ans = INF;
// 枚举所有可能的核心路径 for (int l = 0; l < dlen; l++) { for (int r = l; r < dlen; r++) { int pathLen = segLen[r] - segLen[l]; if (pathLen > s) break;
int ecc = 0; for (int v = 1; v <= n; v++) { int minDist = INF; for (int i = l; i <= r; i++) { minDist = min(minDist, g[v][i]); } ecc = max(ecc, minDist); } ans = min(ans, ecc); } }