Advertisement
ekzolot

Untitled

Jan 24th, 2023
822
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #define int long long
  4. using namespace std;
  5. void dfs(vector<vector<int>>& graph, vector<int>& a, vector<int>& dp1, vector<int>& dp2, vector<bool>& used, int u){
  6.     used[u]=true;
  7.     int sum1=0;
  8.     int sum2=0;
  9.     for (int v:graph[u]){
  10.         if (!used[v]){
  11.             dfs(graph, a, dp1, dp2, used, v);
  12.             sum1+=max(dp1[v], dp2[v]);
  13.             sum2+=dp2[v];
  14.         }
  15.     }
  16.     dp1[u]=max(sum1, sum2+a[u]);
  17.     dp2[u]=sum1;
  18.     //cout<<u<<" "<<dp1[u]<<" "<<dp2[u]<<"\n";
  19.  
  20. }
  21. signed main(){
  22.     int n;
  23.     cin>>n;
  24.     vector <int> a(n);
  25.     for (int i=0; i<n; i++){
  26.         cin>>a[i];
  27.     }
  28.     vector<vector<int>> graph(n);
  29.     for (int i=0; i<n-1; i++){
  30.         int x, y;
  31.         cin>>x>>y;
  32.         x--, y--;
  33.         graph[x].push_back(y);
  34.         graph[y].push_back(x);
  35.     }
  36.     vector <int> dp1(n);
  37.     vector <int> dp2(n);
  38.     vector <bool> used(n);
  39.     dfs(graph, a, dp1, dp2, used, 0);
  40.     cout<<max(dp1[0], dp2[0])<<"\n";
  41. }
  42.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement