这是简单题吗qwq想了很久才出
分析
对于当前结点u
1、求出以u
为根出发的最长路和次长路。(用d1[u]
,d2[u]
来表示)
2、记录当前点u
最长路所连接的(第一个)节点(用nxt[u]
表示)
3、求出当前点u
通过父节点fa
的最长路(用p[u]
来表示)
前两步可以用dfs1
来跑。
最后一步用dfs2
来跑。
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e4+5;
int d1[N],d2[N],p[N],nxt[N];
int n;
int tot,head[N];
struct node{
int to,next,w;
}e[N<<1];
void add(int u,int v,int w){e[tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;}
void dfs1(int u,int fa){
for(int i=head[u];~i;i=e[i].next){
int go=e[i].to;
if(fa==go) continue;
dfs1(go,u);
int dis=d1[go]+e[i].w;
if(dis>d1[u]) {
if(d1[u]!=0) d2[u]=d1[u];
d1[u]=dis;
nxt[u]=go;
}
else if(dis>=d2[u]) d2[u]=dis;
}
}
void dfs2(int u,int fa){
if(fa==-1){
for(int i=head[u];~i;i=e[i].next){
int go=e[i].to;
dfs2(go,u);
}
}
else{
int dis=0;
if(nxt[fa]==u) dis=d2[fa];
else dis=d1[fa];
dis=max(dis,p[fa]);
for(int i=head[fa];~i;i=e[i].next){
int go=e[i].to;
if(go==u) dis+=e[i].w;
}
p[u]=dis;
for(int i=head[u];~i;i=e[i].next){
int go=e[i].to;
if(go==fa) continue;
dfs2(go,u);
}
}
}
int main(){
memset(head,-1,sizeof head);
cin>>n;
for(int i=1;i<n;i++){
int u,v,w; cin>>u>>v>>w;
add(u,v,w); add(v,u,w);
}
dfs1(1,-1);
dfs2(1,-1);
int ans=INF;
for(int i=1;i<=n;i++) ans=min(ans,max(d1[i],p[i]));
cout<<ans<<endl;
return 0;
}