题意:有一棵树,有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; }