1 2 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; }
|