提交时间:2026-06-12 15:19:25
运行 ID: 91228
#include<bits/stdc++.h> using namespace std; struct bbbb{ int to,nextt,xx; }b[10010]; int n,tail,dd[5010],dis[5010],vis[5010],ldd,rdd,diss[5010],ttll; struct llbb{ int xxx,x; }lb[5010]; struct cccc{ int zjcd,bjcd,zd; }cc1[5010],cc2[5010]; void jb(int x,int y,int z){ tail++; b[tail].nextt=dd[x]; b[tail].to=y; b[tail].xx=z; dd[x]=tail; return; } queue<int>q; void bfs(int x){ memset(vis,0,sizeof(vis)); dis[x]=0; vis[x]=1; q.push(x); while(q.empty()==false){ int xx=q.front();q.pop(); for(int i=dd[xx];i!=0;i=b[i].nextt){ if(vis[b[i].to]==0){ vis[b[i].to]=1; dis[b[i].to]=dis[xx]+b[i].xx; q.push(b[i].to); } } } return; } bool dfs(int x,int mb){ if(x==mb){ ttll++; lb[ttll].x=x; return true; } for(int i=dd[x];i!=0;i=b[i].nextt){ if(vis[b[i].to]==0){ vis[b[i].to]=1; if(dfs(b[i].to,mb)==true){ ttll++; lb[ttll].x=x; lb[ttll].xxx=b[i].xx; return true; } } } return false; } int bfs1(int x){ int maxx=0; q.push(x); while(q.empty()==false){ int xx=q.front();q.pop(); maxx=max(maxx,diss[xx]); for(int i=dd[xx];i!=0;i=b[i].nextt){ if(vis[b[i].to]==0){ vis[b[i].to]=1; diss[b[i].to]=diss[xx]+b[i].xx; q.push(b[i].to); } } } return maxx; } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); jb(x,y,z); jb(y,x,z); } bfs(1); for(int i=1;i<=n;i++){ if(dis[ldd]<=dis[i]){ ldd=i;//左端点 } } bfs(ldd); for(int i=1;i<=n;i++){ if(dis[rdd]<=dis[i]){ rdd=i;//右端点 } } memset(vis,0,sizeof(vis)); vis[ldd]=1; dfs(ldd,rdd);//存储树的直径 //-------------上面是树的直径部分----------------- memset(vis,0,sizeof(vis)); for(int i=1;i<=ttll;i++){ vis[lb[i].x]=1; } int zhongd=1; for(int i=2;i<=ttll;i++){ diss[lb[i].x]=diss[lb[i-1].x]+lb[i].xxx; int qwq=bfs1(lb[i].x);//遍历新子树 if(qwq<=cc1[lb[i-1].x].zjcd){ cc1[lb[i].x]=cc1[lb[i-1].x]; } else{ while(zhongd<i&&max(diss[lb[zhongd].x],qwq-diss[lb[zhongd].x])>max(diss[lb[zhongd+1].x],qwq-diss[lb[zhongd+1].x])){ zhongd++;//中点后移 } cc1[lb[i].x].zjcd=qwq;//更新直径 cc1[lb[i].x].bjcd=max(diss[lb[zhongd].x],qwq-diss[lb[zhongd].x]);//更新半径 } } memset(vis,0,sizeof(vis)); memset(diss,0,sizeof(diss)); for(int i=1;i<=ttll;i++){//右侧同理 vis[lb[i].x]=1; } zhongd=ttll; for(int i=ttll-1;i>=1;i--){ diss[lb[i].x]=diss[lb[i+1].x]+lb[i+1].xxx; int qwq=bfs1(lb[i].x); if(qwq<=cc2[lb[i+1].x].zjcd){ cc2[lb[i].x]=cc2[lb[i+1].x]; } else{ while(zhongd>i&&max(diss[lb[zhongd].x],qwq-diss[lb[zhongd].x])>max(diss[lb[zhongd-1].x],qwq-diss[lb[zhongd-1].x])){ zhongd--; } cc2[lb[i].x].zjcd=qwq; cc2[lb[i].x].bjcd=max(diss[lb[zhongd].x],qwq-diss[lb[zhongd].x]); } } int minn=1e9; for(int i=1;i<ttll;i++){//扫描,求出最终答案 minn=min(minn,max(cc1[lb[i].x].bjcd+cc2[lb[i+1].x].bjcd+lb[i+1].xxx,max(cc1[lb[i].x].zjcd,cc2[lb[i+1].x].zjcd))); } printf("%d",minn); return 0; }