rt.
此是不开O2
此是开O2
code:
#include<iostream>
using namespace std;
struct EDGE{
int to,next,val;
}e[500005<<1];
const int MIN=0x80000000;
int cntedge,head[500005];
void addedge(int u,int v,int w){
e[++cntedge].to=v;
e[cntedge].val=w;
e[cntedge].next=head[u];
head[u]=cntedge;
}
void daddedge(int u,int v,int w){
addedge(u,v,w);
addedge(v,u,w);
}
inline int read(){
int t=1,re=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();}
while(ch>='0'&&ch<='9')re=(re<<3)+(re<<1)+(ch^'0'),ch=getchar();
return re*t;
}
int down[500005][2],up[500005],dp[500005];
bool vis[500005];
int n;
void change(int &maxx,int &maxy,int ch){
if(ch>maxx)maxy=maxx,maxx=ch;
else if(ch<=maxx&&ch>maxy)maxy=ch;
}
int dfsdown(int now,int fa){
if(vis[now])return down[now][0];
vis[now]=true;
for(int i=head[now];i;i=e[i].next){
if(e[i].to==fa)continue;
int next=dfsdown(e[i].to,now);
if(next==MIN)next=e[i].val;
else next+=e[i].val;
change(down[now][0],down[now][1],next);
}
return down[now][0];
}
int dfsup(int now,int fa){
for(int i=head[now];i;i=e[i].next){
if(e[i].to==fa)continue;
int dwn=down[now][0];
if(dwn==down[e[i].to][0]+e[i].val){
dwn=down[now][1];
if(dwn==MIN)dwn=0;
}
up[e[i].to]=e[i].val+max(dwn,up[now]);
dfsup(e[i].to,now);
}
}
int ans;
int main(){
cin>>n;
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
daddedge(u,v,w);
}
for(int i=1;i<=n;i++)down[i][0]=down[i][1]=MIN;
dfsdown(1,0);
dfsup(1,0);
for(int i=1;i<=n;i++){
if(down[i][0]==MIN)dp[i]=up[i];
else dp[i]=down[i][0]+max(down[i][1],up[i]);
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}