思路

考虑最简单的情况,的情况。每条边就一定是经过两次——去和回。那么遍历完,每条边就需要复制一次,所以。由于不是回路所以可以减去从起点到终点的路径。所以我们要使起点到终点的路径最长。所以问题就是找到树的直径。答案就是

代码

#include<bits/stdc++.h>
#define ll long long
const int N=1e5+5,INF=0x3f3f3f3f,mod=998244353;
using namespace std;

int n,cnt,maxx=0,ans;
int head[N],dis[N];
struct node
{
    int nxt,to,val;
}e[N<<1];

inline int read()
{
    register int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}

int qpow(int a,int b)
{
    int ans=1;
    while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}
    return ans;
}

void add(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].nxt=head[u];
    e[cnt].val=w;
    head[u]=cnt;
}

void dfs(int x,int fa)
{
    for(int i=head[x];i;i=e[i].nxt)
    {
        int y=e[i].to;
        if(y==fa)    continue ;
        dfs(y,x);
        maxx=max(maxx,dis[x]+dis[y]+e[i].val);
        dis[x]=max(dis[x],dis[y]+e[i].val);
    }
}

int main()
{
    n=read();
    for(int i=1;i<n;i++)
    {
        int u,v,w;
        u=read();v=read();w=read();
        add(u,v,w);add(v,u,w);
        ans+=w; 
    }
    dfs(1,0);
    printf("%lld",ans*2ll-maxx);
    return 0;
}