ZhongJiaXuan

P8625 [蓝桥杯 2015 省 B] 生命之树

Jan 12th, 2024
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.86 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 1e5 + 10;
  5. vector<int> Edge[N];
  6. int n, arr[N], dp[N][2], x, y;
  7. void dfs(int x, int fa) {
  8.     for (int i : Edge[x])
  9.         if (i != fa)
  10.             dfs(i, x);
  11.     dp[x][0] = INT_MIN; // 不选自己
  12.     for (int i : Edge[x])
  13.         if (i != fa)
  14.             dp[x][0] = max(dp[x][0], max(dp[i][0], dp[i][1]));
  15.     // 选自己
  16.     dp[x][1] = arr[x];
  17.     for (int i : Edge[x])
  18.         if (i != fa)
  19.             dp[x][1] += max(0LL, dp[i][1]);
  20.     return;
  21. }
  22. signed main() {
  23.     ios::sync_with_stdio(false);
  24.     cin.tie(0);
  25.     cin >> n;
  26.     for (int i = 1; i <= n; i++) cin >> arr[i];
  27.     for (int i = 1; i < n; i++) {
  28.         cin >> x >> y;
  29.         Edge[x].push_back(y);
  30.         Edge[y].push_back(x);
  31.     }
  32.     dfs(1, 0);
  33.     cout << max(0LL, max(dp[1][0], dp[1][1]));
  34. }
Advertisement
Add Comment
Please, Sign In to add comment