|
|
#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++;
|
|
|
}
|
|
|
|
|
|
// 换根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;
|
|
|
} |