非常巧妙的转换。首先我们可以观察性质,一条边不可能出现两次,因为显然可以被更好的方案替代
之后,每个边就存在选或者不选两种情况
如果以子树的节点为偶数,那么就不需要,否则需要,做一下dfs即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1e9+7; ll ans; int h[N],ne[N],e[N],idx,w[N]; int cnt[N]; 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 i; cnt[u]=1; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa) continue; cnt[u]+=dfs(j,u); if(cnt[j]%2){ ans+=w[i]; } } return cnt[u]; } int main(){ int t; cin>>t; while(t--){ int n; cin>>n; int i; memset(cnt,0,sizeof cnt); memset(h,-1,sizeof h); idx=0; ans=0; for(i=1;i<n;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } dfs(1,0); cout<<ans<<endl; } return 0; }