看讨论区很多 80 pts 的,咋都不分享一下挂分原因呢?
80分求调。
#include <bits/stdc++.h>
using namespace std;
const int N = 5010, M = 10010;
struct edge {
int to, next, w;
} e[M];
int head[N], idx = 1;
bool del[M];
void add(int u, int v, int w) {
idx++, e[idx].to = v, e[idx].w = w, e[idx].next = head[u], head[u] = idx;
}
int n;
int f[N][2];
int maxx;
void dfs(int u, int fa) {
for (int i = head[u]; i; i = e[i].next) {
int to = e[i].to;
if (del[i]) continue;
if (to == fa) continue;
dfs(to, u);
if (f[u][0] < f[to][0] + e[i].w) {
f[u][1] = f[u][0];
f[u][0] = f[to][0] + e[i].w;
}
else if (f[u][1] < f[to][0] + e[i].w) {
f[u][1] = f[to][0] + e[i].w;
}
}
maxx = max(maxx, f[u][0] + f[u][1]);
}
int solve(int u) {
memset(f, 0, sizeof(f));
maxx = 0;
dfs(u, 0);
return maxx;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i < n; i++) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
}
int ans = 0x3f3f3f3f;
for (int i = 2; i <= idx; i += 2) {
del[i] = del[i ^ 1] = true;
int x1 = solve(e[i].to);
int x2 = solve(e[i ^ 1].to);
ans = min(ans, max(max(x1, x2), (x1 + 1) / 2 + (x2 + 1) / 2 + e[i].w));
del[i] = del[i ^ 1] = false;
}
cout << ans << '\n';
return 0;
}