蓝桥杯 算法训练 结点选择

题解参考:https://blog.csdn.net/u013852115/article/details/79437734

https://www.cnblogs.com/A-Little-Nut/p/10394084.html

语法参考:https://www.cnblogs.com/zhuruibi/p/8983192.html

https://www.cnblogs.com/home123/p/7450758.html

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+5;
 4 int dp[2][N]={0};
 5 vector<vector<int> > ve;
 6 void dfs(int now,int pre)//因为只有一个来处,所以用一个值来标识即可,不需用到vis数组
 7 {
 8     for (int i=0;i<ve[now].size();i++)
 9     {
10         int to=ve[now][i];
11         if (to==pre) continue;
12         dfs(to,now);
13         dp[0][now]+=max(dp[0][to],dp[1][to]);//注意是+=!
14         dp[1][now]+=dp[0][to];
15     }
16 }
17 int main()
18 {
19 //    freopen("in.txt","r",stdin);
20     int n;
21     cin>>n;
22     ve.resize(n+1);//此句不能少!!
23     for (int i=1;i<=n;i++)//注意审题,这里需从0开始!!
24     {
25         int tmp;
26         cin>>tmp;
27         dp[1][i]=tmp;//tmp是第i个节点的权值不是第tmp个节点的权值!!
28     }
29     for (int i=0;i<n-1;i++)
30     {
31         int a,b;
32         cin>>a>>b;
33         ve[a].push_back(b);
34         ve[b].push_back(a);
35     }
36     dfs(1,0);
37     cout<<max(dp[0][1],dp[1][1])<<endl;
38 
39     return 0;
40 }
原文地址:https://www.cnblogs.com/hemeiwolong/p/10473525.html