定义状态$f[u][1]$为以u为根遍历完子树的最小权值且不走回根节点u。
$f[u][0]$为以u为根遍历完子树的最小权值且走回根节点u。
当需要走回根节点时,所有子节点也需要走回根节点,且连接两点的边权$w$需要走两遍,去和回。
当不需要走回来时,就是所有子节点有一个节点不需要返回,那么减去一个返回和不返回情况差值最大的。
最后答案为$f[1][1]$
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> PII;
#define pb(s) push_back(s);
#define SZ(s) (int)s.size();
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N=200010;
int n;
std::vector<PII> e[N];
//0为走回根节点的最小权值,1为不走回
LL f[N][2];
void dfs(int u,int fa)
{
LL s=0;
for(auto [ne,w]:e[u])
{
if(ne==fa) continue;
dfs(ne,u);
f[u][0]+=f[ne][0]+w*2;
s=max(s,f[ne][0]+w-f[ne][1]);
}
f[u][1]=f[u][0]-s;
}
void solve()
{
cin>>n;
for(int i=0;i<n-1;++i)
{
int u,v,w;
cin>>u>>v>>w;
e[u].push_back({v,w});
e[v].push_back({u,w});
}
dfs(1,-1);
cout<<f[1][1]<<'\n';
}
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
while(t--)
{
solve();
}
return 0;
}