#include using namespace std; const int N = 10010, M = N << 1; int n; // n个结点 // 链式前向星 int h[N], e[M], w[M], ne[M], idx; void add(int a, int b, int c) { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; } int ans; // 答案,直径 int mx1[N], mx2[N]; // mx1[i],mx2[i]:经过i点的最长,次长长度是多少 void dfs(int u, int fa) { for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (v == fa) continue; // v点访问过了 // 走v子树,完成后,v子树中每个节点的mx1[v],mx2[v]都已经准备好,u节点可以直接利用 dfs(v, u); // w[i]:u->v的路径长度,mx1[u]:最长路径,mx2[u]:次长路径 int x = mx1[v] + w[i]; if (mx1[u] <= x) // v可以用来更新u的最大值 mx2[u] = mx1[u], mx1[u] = x; // 最长路转移 else if (mx2[u] < x) mx2[u] = x; // 次长路转移 } // 更新结果 ans = max(ans, mx1[u] + mx2[u]); } int main() { cin >> n; memset(h, -1, sizeof h); // 初始化邻接表 for (int i = 1; i < n; i++) { // n-1条边 int a, b, c; cin >> a >> b >> c; add(a, b, c), add(b, a, c); // 换根dp一般用于无向图 } dfs(1, 0); // 任选一个点作为根节点,此处选择的是肯定存在的1号结点 cout << ans << endl; return 0; }