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.

68 lines
2.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
const int N = 10010, M = N << 1;
const int INF = 0x3f3f3f3f;
int n; // n个节点
int mx1[N]; // mx1[u]u节点向下走的最长路径的长度
int mx2[N]; // mx2[u]u节点向下走的次长路径的长度
int id[N]; // id[u]u节点向下走的最长路径是从哪一个节点下去的
int up[N]; // up[u]u节点向上走的最长路径的长度
// 邻接表
int e[M], h[N], idx, w[M], ne[M];
void add(int a, int b, int c = 0) {
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
// 功能:以u为根向叶子进行递归利用子节点返回的最长信息更新自己的最长和次长,并记录最长是从哪个节点来的
void dfs1(int u, int fa) {
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (v == fa) continue;
// 递归完才能有数据
dfs1(v, u);
int x = mx1[v] + w[i]; // u问到儿子v可以带我走多远
if (mx1[u] < x) { // 更新最长
mx2[u] = mx1[u]; // ① 更新次长
mx1[u] = x; // ② 更新最长
id[u] = v; // ③ 记录最长来源
} else if (mx2[u] < x) // 更新次长
mx2[u] = x;
}
}
// 功能:完成向上的信息填充
void dfs2(int u, int fa) {
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (v == fa) continue;
// 二者取其一
if (id[u] == v)
up[v] = max(mx2[u], up[u]) + w[i];
else
up[v] = max(mx1[u], up[u]) + w[i];
// 递归
dfs2(v, u);
}
}
int main() {
memset(h, -1, sizeof h);
cin >> n;
for (int i = 1; i < n; i++) {
int a, b, c;
cin >> a >> b >> c;
add(a, b, c), add(b, a, c);
}
dfs1(1, 0); // 选择任意一个节点进行dfs,用儿子更新父亲的统计信息
dfs2(1, 0); // 向上
int res = INF;
for (int i = 1; i <= n; i++) res = min(res, max(mx1[i], up[i]));
printf("%d\n", res);
return 0;
}