蓝桥杯 算法训练 结点选择
题解参考: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 }