题目
思路
我们可以在dfs遍历时顺便统计以每个节点为根的子树的节点个数,然后在回溯的时候判断如果以当前节点的子节点为根的子树的节点个数个数为偶数,说明这些点可以两两配对,所以当前节点与子节点之间不需要配对,否则的话就把答案加上当前节点与子节点之间的边权就行了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{int u,len;
};
vector<node>vec[100001];
int ans,zi[100001],n,x,y,len;
void dfs(int u,int fa)
{zi[u] = 1;for(int i = 0;i < vec[u].size();i++)if(vec[u][i].u != fa){dfs(vec[u][i].u,u);zi[u] += zi[vec[u][i].u];if(zi[vec[u][i].u] % 2 == 1) ans += vec[u][i].len;}
}
signed main()
{cin>>n;for(int i = 1;i < n;i++){cin>>x>>y>>len;vec[x].push_back({y,len});vec[y].push_back({x,len});}dfs(1,0);cout<<ans<<endl;return 0;
}
结语
如果您觉得这篇博客写的不错的话,请点个赞吧!ヾ(≧▽≦*)o