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