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
| #include<bits/stdc++.h> #define int long long using namespace std; const int N = 10010, M = N * 2, inf = 1e18; int head[M], ne[M], to[M], w[M], idx; int s1[N], s2[N], d1[N], d2[N], up[N];
int n;
void add(int x, int y, int z) { to[idx] = y, ne[idx] = head[x], w[idx] = z, head[x] = idx++; } void dfs1(int u, int fa) { for(int i = head[u]; ~i; i = ne[i]) { int v = to[i]; if(v == fa) continue; dfs1(v, u);
if(d1[v] + w[i] >= d1[u]) { d2[u] = d1[u], d1[u] = d1[v] + w[i]; s2[u] = s1[u], s1[u] = v; } else if(d1[v] + w[i] > d2[u]) { d2[u] = d1[v] + w[i], s2[u] = v; } } } void dfs2(int u, int fa) { for(int i = head[u]; ~i; i = ne[i]) { int v = to[i]; if(v == fa) continue; if(s1[u] == v) up[v] = w[i] + max(d2[u], up[u]); else up[v] = w[i] + max(d1[u], up[u]); dfs2(v, u); } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); memset(head, -1, sizeof head); cin >> n; for(int i = 1; i < n; i++) { int a, b, c; cin >> a >> b >> c; add(a, b, c); add(b, a, c); }
dfs1(1, 0); dfs2(1, 0);
int res = inf; for(int i = 1; i <= n; i++) res = min(res, max(d1[i], up[i])); cout << res; return 0; }
|