#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++; } // 换根dp模板 int ans; // 答案,直径 int d1[N], d2[N]; // d1[i],d2[i]:经过i点的最长,次长长度是多少 bool st[N]; // 是不是遍历过了 void dfs(int u) { st[u] = true; for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (st[v]) continue; // v点访问过了 // 走v子树,完成后,v子树中每个节点的d1[v],d2[v]都已经准备好,u节点可以直接利用 dfs(v); // w[i]:u->v的路径长度,d1[u]:最长路径,d2[u]:次长路径 if (d1[v] + w[i] >= d1[u]) // v可以用来更新u的最大值 d2[u] = d1[u], d1[u] = d1[v] + w[i]; // 最长路转移 else if (d1[v] + w[i] > d2[u]) d2[u] = d1[v] + w[i]; // 次长路转移 } // 更新结果 ans = max(ans, d1[u] + d2[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); // 任选一个点作为根节点,此处选择的是肯定存在的1号结点 cout << ans << endl; return 0; }