这个题看起来无从下手,但是仔细分析会发现,我们dfs得出每个子树的节点个数,如果是奇数,那么我们就需要加上这条连向这个点的边权值,因为奇数个点不可能完成题目要求两两分组。如果节点个数为偶数就不用管。
#include<bits/stdc++.h> using namespace std; const int N=2e4+10; int h[N],e[N],w[N],ne[N],idx; long long ans; void add(int a,int b ,int c) { w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++; } int dfs(int u,int fa,int len) { int sum=1; for(int i=h[u];i!=-1;i=ne[i]) { int v=e[i],ww=w[i]; if(v==fa) continue; sum+=dfs(v,u,ww); } if(sum%2) ans+=len; return sum; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; memset(h,-1,sizeof(h)); ans=0; idx=0; for(int i=0;i<n-1;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } dfs(1,0,0); cout<<ans<<endl; } }