You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.5 KiB

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