fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long int ll;
  5.  
  6. vector<vector<ll>> dp;
  7. ll n, d;
  8.  
  9. void dfs(ll node, ll parent, const vector<ll>& used, const vector<vector<ll>>& G, const vector<ll>& a) {
  10. ll sum_not_chosen = 0;
  11. ll sum_chosen = a[node];
  12.  
  13. for (auto u : G[node]) {
  14. if (u != parent) {
  15. dfs(u, node, used, G, a);
  16. sum_not_chosen += max(dp[u][1], dp[u][0]);
  17. sum_chosen += max(dp[u][1] - 2 * d, dp[u][0]);
  18. }
  19. }
  20.  
  21. dp[node][1] = sum_chosen;
  22. dp[node][0] = sum_not_chosen;
  23. }
  24.  
  25. int main(){
  26. ios::sync_with_stdio(false);
  27. cin.tie(nullptr);
  28. cout.tie(nullptr);
  29.  
  30. ll t;
  31. if (cin >> t) {
  32. while (t--) {
  33. cin >> n >> d;
  34.  
  35. vector<ll> a(n + 1, 0);
  36. for (ll i = 1; i <= n; i++) {
  37. cin >> a[i];
  38. }
  39.  
  40. vector<vector<ll>> G(n + 1);
  41. for (ll i = 1; i <= n - 1; i++) {
  42. ll u, v;
  43. cin >> u >> v;
  44. G[u].push_back(v);
  45. G[v].push_back(u);
  46. }
  47.  
  48. dp.assign(n + 5, vector<ll>(2, 0));
  49. vector<ll> used(n + 1, 0);
  50.  
  51. dfs(1, 0, used, G, a);
  52.  
  53. cout << max(dp[1][1], dp[1][0]) << "\n";
  54. }
  55. }
  56. return 0;
  57. }
Success #stdin #stdout 0.01s 5320KB
stdin
5
3 1
2 3 1
1 2
2 3
3 1
3 6 3
1 2
2 3
3 1
-2 -3 -1
1 2
2 3
6 1
5 -4 3 6 7 3
4 1
5 1
3 5
3 6
1 2
8 1
3 5 2 7 8 5 -3 -4
7 3
1 8
4 3
3 5
7 6
8 7
2 1
stdout
3
8
0
17
26