#include<bits/stdc++.h>
#define rep(I,a,b) for(ll I=(a);I<=(b);I++)
#define ll long long
using namespace std;
const ll N=2e5+5,INF=1e18;
ll n;
struct qxx{
ll to,nxt,w;
}es[N<<2];
ll hd[N],tot;
inline void adde(ll u,ll v,ll w){
es[++tot]=(qxx){v,hd[u],w};
hd[u]=tot;
}
ll f[N][3];
vector<ll> g[N][3];
ll tmp[N];
ll mx[N][2];
ll vst[N];
ll kk[N][3];
ll ans=0;
void dfs(ll u,ll fa){
//f[u][0]=0;
vst[u]=1;
ll mxv=0,mxv_t=0;
for(ll i=hd[u];i;i=es[i].nxt){
ll v=es[i].to,w=es[i].w;
if(v==fa) continue;
dfs(v,u);
}
for(ll i=hd[u];i;i=es[i].nxt){
ll v=es[i].to,w=es[i].w;
if(v==fa) continue;
f[u][0]+=max(f[v][0],f[v][2]+w);
tmp[v]=f[v][0]+w-max(f[v][0],f[v][2]+w);
if(tmp[v]>tmp[mxv_t]) mxv_t=v;
if(tmp[mxv_t]>tmp[mxv]) swap(mxv_t,mxv);
}
f[u][2]=f[u][0]+tmp[mxv];
mx[u][0]=mxv;
mx[u][1]=mxv_t;
}
void dfs2(ll u,ll fa,ll bkl,ll bkl2,ll w){
//cout<<u<<' '<<fa<<' '<<bkl<<' '<<bkl2<<' '<<w<<endl;
ll mxv=mx[u][0],mxv_t=mx[u][1];
if(fa!=0){
tmp[n+1]=bkl+w-max(bkl,bkl2+w);
if(tmp[fa]>tmp[mxv_t]) mxv_t=n+1;
if(tmp[mxv_t]>tmp[mxv]) swap(mxv_t,mxv);
}
kk[u][0]=f[u][0]+max(bkl,bkl2+w);
ans=max(ans,kk[u][0]);
for(ll i=hd[u];i;i=es[i].nxt){
ll v=es[i].to,w=es[i].w;
if(v==fa) continue;
ll bk=0,bk2=0;
bk=kk[u][0]-max(f[v][0],f[v][2]+w);
if(v==mxv) bk2=bk+tmp[mxv_t];
else bk2=bk+tmp[mxv];
g[u][0].push_back(bk);
g[u][2].push_back(bk2);
//cout<<u<<' '<<v<<' '<<bkl<<' '<<bkl2<<endl;
}
ll vid=0;
for(ll i=hd[u];i;i=es[i].nxt){
//cout<<vid<<' '<<g[u][0].size()<<' '<<g[u][2].size()<<endl;
ll v=es[i].to,w=es[i].w;
if(v==fa) continue;
dfs2(v,u,g[u][0][vid],g[u][2][vid],w);//todo
++vid;
}
}
int main(){
scanf("%lld",&n);
rep(i,1,n-1){
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
adde(u,v,w);
adde(v,u,w);
}
tmp[0]=-INF;
dfs(1,0);
//cout<<f[1][0]<<endl;
kk[1][0]=f[1][0];
dfs2(1,0,0,0,0);
printf("%lld\n",ans);
return 0;
}
90pts 第7个点WA,求助
应该有人和我错同一个地方的吧(讨论里另一个90pts错的也是这个点)