题目链接:https://ac.nowcoder.com/acm/contest/1109/H
代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 1006
#define ll long long int
#define INF 0x3f3f3f3f
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define mem(a) memset(a,0,sizeof(a))
#define sqr(x) (x*x)
#define inf (ll)2e18+1
#define PI acos(-1)
#define mod 10007
#define auto(i,x) for(int i=head[x];i;i=ed[i].nxt)
ll read(){
ll x=0,f=1ll;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int n;
struct edge{int v,w,nxt;}ed[maxn<<1];
int head[maxn],tot;
void add(int x,int y,int z){ed[++tot]={y,z,head[x]};head[x]=tot; }
void ed_clr(int n){tot=0;inc(i,1,n)head[i]=0; }
ll dd,d[maxn][2];
int s,t,fast;
void dfs(int x,int y,ll dis){
if(dis>dd){
fast=x;
dd=dis;
}
for(int i=head[x];i;i=ed[i].nxt){
int v=ed[i].v;
int w=ed[i].w;
if(v==y)continue;
dfs(v,x,dis+w);
}
}
void dfs1(int x,int y,int p){
for(int i=head[x];i;i=ed[i].nxt){
int v=ed[i].v;
int w=ed[i].w;
if(v==y)continue;
d[v][p]=d[x][p]+w;
dfs1(v,x,p);
}
}
int main()
{
while(~scanf("%d",&n)){
int x,y,z;
inc(i,1,n-1){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}
dd=0;
dfs(1,0,0);
s=fast;
dd=0;
dfs(s,0,0);
t=fast;
//printf("%d %d\n",s,t);
ll ans=dd;
d[s][0]=d[t][1]=0;
dfs1(s,0,0);
dfs1(t,0,1);
inc(i,1,n)if(i!=s&&i!=t)ans+=max(d[i][0],d[i][1]);
printf("%lld\n",ans);
ed_clr(n);
}
return 0;
}