Advertisement
matheus_monteiro

Nós da árvore

Sep 14th, 2024
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. const int OO = 1000000000;
  5. const int ms = 20000;
  6.  
  7. int n, x;
  8. vector<int> val, sz;
  9. vector<int> G[ms];
  10. vector<vector<int>> dp; // dp[ms][ms]
  11.  
  12. void init() {
  13.     val.resize(n);
  14.     sz.resize(n);
  15.     dp = vector<vector<int>>(n + 1, vector<int>(x + 1, -OO));
  16.     for(int i = 0; i < n; ++i)
  17.         dp[i][0] = 0;
  18. }
  19.  
  20. void dfs(int u, int p) {
  21.     sz[u] = 1;
  22.     for(const int &v : G[u]) {
  23.         if(v == p) continue;
  24.         dfs(v, u);
  25.         sz[u] += sz[v];
  26.  
  27.         int T = min(x, sz[u] - 1);
  28.  
  29.         vector<int> dp_u = dp[u];
  30.  
  31.         for(int a = 0; a <= T; ++a)
  32.             for(int b = 0; b <= a; ++b)
  33.                 if(dp[v][b] != -OO && dp_u[a - b] != -OO)
  34.                     dp[u][a] = max(dp[u][a], dp[v][b] + dp_u[a - b]);
  35.     }
  36.     dp[u][1] = max(dp[u][1], val[u]);
  37. }
  38.  
  39. int main(){
  40.     cin >> n >> x;
  41.  
  42.     init();
  43.  
  44.     for(int i = 0; i < n; ++i)
  45.         cin >> val[i];
  46.  
  47.     for(int i = 1; i < n; ++i) {
  48.         int u, v;
  49.         cin >> u >> v;
  50.         --u; --v;
  51.         G[u].push_back(v);
  52.         G[v].push_back(u);
  53.     }
  54.  
  55.     dfs(0, -1);
  56.  
  57.     if(dp[0][x] != -OO)
  58.         cout << dp[0][x] << '\n';
  59.     else
  60.         cout << "impossivel\n";
  61.  
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement