#include<bits/stdc++.h> #define MAXN 5005 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^'0'); ch=getchar(); } return x*f; } structEdge{ int to,len; }; vector<Edge>G[MAXN]; inlinevoidAddEdge(int u,int v,int w){ G[u].push_back(Edge{v,w}); } int n; int fa[MAXN],d[MAXN]; int vis[MAXN]; queue<int>Q; inlineintbfs(int u,int father){ while (Q.size()) Q.pop(); memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); memset(d,0,sizeof(d)); fa[u]=father,d[u]=0; vis[u]=vis[father]=1;//等于是阻断到另一个子树的路 Q.push(u); int ans=0; while (Q.size()){ int u=Q.front();Q.pop(); vis[u]=true; if (d[u]>d[ans]) ans=u; for (registerint i=0;i<G[u].size();++i){ int v=G[u][i].to,w=G[u][i].len; if (vis[v]) continue; d[v]=d[u]+w; fa[v]=u;//记录父亲,等于是记录直径 Q.push(v); } } return ans; } inlineintFindMid(int p,int q){//树的半径的长度,q为最深的点 int len=d[q]; int ans=0x7fffffff; while (true){ ans=min(ans,max(d[q],len-d[q])); q=fa[q];//慢慢爬上来 if (q==0) break; } return ans; } int U[MAXN],V[MAXN],W[MAXN]; intmain(){ int n=read(); for (registerint i=1;i<n;++i){ U[i]=read(),V[i]=read(),W[i]=read(); AddEdge(U[i],V[i],W[i]); AddEdge(V[i],U[i],W[i]); } int ans=0x7fffffff; for (registerint i=1;i<n;++i){ int u=U[i],v=V[i]; int p1=bfs(u,v);int q1=bfs(p1,v);//直径的两个端点 int len1=d[q1];int ans1=FindMid(p1,q1);
int p2=bfs(v,u);int q2=bfs(p2,u); int len2=d[q2];int ans2=FindMid(p2,q2);