思路见代码
#include<bits/stdc++.h> //树的中心
using namespace std; //对于一棵树的每一个结点,该结点与离该最远的结点的路径
const int N = 1e4 + 10; // 要么过这该点的子结点,要么过该点的父节点
const int M = N << 1;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f;
int h[N];
int cnt = 0;
ll w[M],to[M],ne[M];
ll d1[N],d2[N],up[N]; //记录每个结点向下的最长路 和 次长路
int p1[N]; //记录最长路向下经过的第一个子结点
void add(ll x, ll y, ll z){
to[++cnt] = y, w[cnt] = z, ne[cnt] = h[x], h[x] = cnt;
}
void dfs_d(int u,int fa){
for(int i = h[u]; ~i ; i = ne[i]){
int x = to[i];
if(x == fa)
continue;
dfs_d(x,u);
int d = d1[x] + w[i];
if(d >= d1[u]){
d2[u] = d1[u];
d1[u] = d;
p1[u] = x;
}else if(d > d2[u]){
d2[u] = d;
}
}
if(!p1[u]) d1[u] = 0;
}
void dfs_u(int u,int fa){
for(int i = h[u]; ~i; i = ne[i]){
int x = to[i];
if(x == fa)
continue;
if(x != p1[u]){
up[x] = max(d1[u],up[u]) + w[i];
}else up[x] = max(d2[u],up[u]) + w[i];
dfs_u(x,u);
}
}
int main(){
memset(h, -1,sizeof h);
memset(d1, -0x3f, sizeof d1);
memset(d2, -0x3f, sizeof d2);
int n; cin >> n;
for(int i = 1; i < n; ++i){
int x,y,z; cin >> x >> y >> z;
add(x,y,z);
add(y,x,z);
}
dfs_d(1,-1);
dfs_u(1,-1);
ll ans = inf;
for(int i = 1 ;i <= n; ++i)
ans = min(ans,max(d1[i],up[i]));
cout << ans ;
system("pause");
return 0;
}