题目链接
题意:给定一棵树,现在从1出发走遍树中所有点的路径和最小。
思路:dp【i】表示i的子树中最长的一条路径,答案就是边的总和*2-dp【1】。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+1;
vector<pair<int,ll>>g[maxn];
ll sum=0,w,dp[maxn];
void dfs(int x,int fa)
{
for(auto to:g[x])
{
if(to.first==fa) continue;
dfs(to.first,x);
dp[x]=max(dp[x],dp[to.first]+to.second);
}
}
int main()
{
int n,u,v;
scanf("%d",&n);
for(int i=1;i<n;++i)
{
scanf("%d%d%lld",&u,&v,&w);
g[u].push_back({v,w});
g[v].push_back({u,w});
sum+=w;
}
memset(dp,0,sizeof(dp));
dfs(1,0);
printf("%lld\n",sum*2-dp[1]);
}