|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
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;
|
|
|
} |