题目链接:https://ac.nowcoder.com/acm/problem/13886
题意:有一棵树,有n个节点。让你分成n/2对。所有对之间的距离和最小。
思路:我们尽量让每条边不重复经过。那么对于一棵子树v。和他的父亲节点u。还有之间的边权w。如果siz[u]%2== 1那么v就和u连。ans+=w。如果siz[u]%2== 0那么v和自己的子树连过了。不加w的贡献。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
vector<vector<pair<int , LL> > > v(10005);
LL ans=0;
int DFS(int u, int fa, int w){
int cut=1;
for(auto x: v[u]){
if(x.first!=fa){
cut+=DFS(x.first, u, x.second);
}
}
if(cut%2){
ans+=w;
}
return cut;
}
int main(){
int t; scanf("%d", &t);
while(t--){
int n, x, y, z; scanf("%d",&n);
for(int i=1; i<n; i++){
scanf("%d%d%d", &x, &y, &z);
v[x].push_back({y, z});
v[y].push_back({x, z});
}
ans=0;
DFS(1, 0, 0);
for(int i=1; i<=n; i++) v[i].clear();
printf("%lld\n", ans);
}
return 0;
}