a53

Xor Tree

a53
Nov 19th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int NMAX = 2e5;
  7.  
  8. int N;
  9. vector <int> g[NMAX + 2];
  10. long long cst[NMAX + 2];
  11.  
  12. const long long INF = 1e18;
  13. long long dp[NMAX + 2][2];
  14.  
  15. void dfs(int node, int dad)
  16. {
  17.  
  18. if(node != 1 && g[node].size() == 1)
  19. {
  20. dp[node][0] = cst[node];
  21. dp[node][1] = 0;
  22. return ;
  23. }
  24.  
  25. dp[node][0] = dp[node][1] = -INF;
  26.  
  27. for(auto it : g[node])
  28. if(it != dad)
  29. {
  30. dfs(it, node);
  31.  
  32. if(dp[node][0] == -INF)
  33. {
  34. dp[node][0] = dp[it][0];
  35. dp[node][1] = dp[it][1];
  36. continue;
  37. }
  38.  
  39. long long dp0 = dp[node][0], dp1 = dp[node][1];
  40.  
  41. dp[node][0] = max(dp0 + dp[it][0], dp1 + dp[it][1]);
  42. dp[node][1] = max(dp1 + dp[it][0], dp0 + dp[it][1]);
  43. }
  44.  
  45. dp[node][0] += cst[node];
  46. }
  47.  
  48. int main()
  49. {
  50. cin >> N;
  51.  
  52. for(int i = 1; i < N; i++)
  53. {
  54. int a, b;
  55. cin >> a >> b;
  56.  
  57. g[a].push_back(b);
  58. g[b].push_back(a);
  59. }
  60.  
  61. for(int i = 1; i <= N; i++)
  62. cin >> cst[i];
  63.  
  64. dfs(1, -1);
  65.  
  66. cout << max(dp[1][0], dp[1][1]) << '\n';
  67.  
  68. return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment