给定一个 n个节点的树。节点编号为 1∼n。树中所有边均为双向边,且长度均已知。你需要从 1 号点出发,沿着一条路径遍历树中所有点,路径中可以包含重复的点和边。要求,你的行程总长度应尽可能短。请你计算,你所需的行程总长度的最小可能值。注意,你可以在任意点结束你的行程。
输入格式
第一行包含整数 n。接下来 n−1 行,每行包含三个整数 x,y,w,表示点 x 和点 y 之间存在一条双向边,长度为 w。
输出格式
一个整数,表示行程总长度的最小可能值。
数据范围
前 4 个测试点满足 1≤n≤5。所有测试点满足 1≤n≤105,1≤x,y≤n,0≤w≤2×104。
输入样例1:
3
1 2 3
2 3 4
输出样例1:
7
输入样例2:
3
1 2 3
1 3 3
输出样例2:
9
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010,M=2*N;
int h[N],e[M],ne[M],w[M],idx;
int n;
long long ans;
void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int dfs(int u,int fa)
{int res=0;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;res=max(res,dfs(j,u)+w[i]);}return res;
}
int main()
{cin>>n;memset(h,-1,sizeof h);for(int i=0;i<n-1;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);ans+=2*c;} cout<<ans-dfs(1,-1);return 0;
}