| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 
 | #include <cstring>#include <iostream>
 using namespace std;
 
 const int N = 10010, M = N * 2, INF = 0x3f3f3f3f;
 int h[N], w[M], e[M], ne[M], idx;
 int n;
 int d1[N], d2[N], p1[N], up[N];
 bool is_leaf[N];
 
 void add(int a, int b, int c) {
 e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
 }
 
 
 int dfs_d(int u, int father) {
 d1[u] = d2[u] =
 -INF;
 for (int i = h[u]; i != -1; i = ne[i]) {
 int j = e[i];
 if (j == father) continue;
 int d =
 dfs_d(j, u) +
 w[i];
 if (d >
 d1[u]) {
 d2[u] = d1[u], d1[u] = d;
 p1[u] = j;
 } else if (d > d2[u])
 d2[u] = d;
 }
 if (d1[u] ==
 -INF) {
 d1[u] = d2[u] = 0;
 is_leaf[u] = true;
 }
 return d1[u];
 }
 
 
 void dfs_u(int u, int father) {
 for (int i = h[u]; i != -1; i = ne[i]) {
 int j = e[i];
 if (j == father) continue;
 if (p1[u] == j)
 up[j] = max(up[u], d2[u]) + w[i];
 else
 up[j] = max(up[u], d1[u]) + w[i];
 dfs_u(j, u);
 }
 }
 
 int main() {
 
 memset(h, -1, sizeof h);
 cin >> n;
 for (int i = 0; i < n - 1; i++) {
 int a, b, c;
 cin >> a >> b >> c;
 add(a, b, c), add(b, a, c);
 }
 dfs_d(1, -1);
 dfs_u(1, -1);
 int res = d1[1];
 for (int i = 2; i <= n; i++) {
 if (is_leaf[i])
 res = min(res, up[i]);
 else
 res = min(res, max(d1[i], up[i]));
 }
 printf("%d\n", res);
 return 0;
 }
 
 |