Advertisement
Dang_Quan_10_Tin

PNODES

Jul 15th, 2021
1,069
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5. using ld = long double;
  6. using ull = unsigned long long;
  7.  
  8. constexpr bool typetest = 0;
  9. constexpr int N = 2e2 + 5;
  10. constexpr int Inf = 1e9 + 7;
  11. int n, p, m[N], cnt[N];
  12. int dp[N][N][N], par[N][N][N];
  13. vector<int> adj[N];
  14. int a[N], ans(-Inf), piv(1);
  15.  
  16. void Read()
  17. {
  18.     cin >> n >> p;
  19.     for (int i = 1; i <= n; ++i)
  20.         cin >> a[i];
  21.     for (int i = 1; i < n; ++i)
  22.     {
  23.         int u, v;
  24.         cin >> u >> v;
  25.         adj[u].emplace_back(v);
  26.         adj[v].emplace_back(u);
  27.     }
  28. }
  29.  
  30. void dfs(int v, int parpar = 0)
  31. {
  32.     cnt[v] = 1;
  33.     for (int i = (int)adj[v].size() - 1; ~i; --i)
  34.         if (adj[v][i] == parpar)
  35.             adj[v][i] = adj[v].back(), adj[v].pop_back();
  36.         else
  37.             dfs(adj[v][i], v), cnt[v] += cnt[adj[v][i]];
  38.  
  39.     m[v] = adj[v].size();
  40.     adj[v].emplace_back(0);
  41.     sort(adj[v].begin(), adj[v].end());
  42.  
  43.     dp[v][0][1] = a[v];
  44.     for (int i = 1, sum(1); i <= m[v]; ++i)
  45.     {
  46.         sum += cnt[adj[v][i]] + 1;
  47.         for (int j = 1; j <= sum; ++j)
  48.             for (int t = min(cnt[adj[v][i]], j - 1), tmp; ~t; --t)
  49.                 if (dp[v][i][j] < (tmp = dp[v][i - 1][j - t] + dp[adj[v][i]][m[adj[v][i]]][t]))
  50.                 {
  51.                     dp[v][i][j] = tmp;
  52.                     par[v][i][j] = t;
  53.                 }
  54.         //cout << v << " " << i << ": " << sum << "\n";
  55.     }
  56.     if (ans < dp[v][m[v]][p])
  57.     {
  58.         ans = dp[v][m[v]][p];
  59.         piv = v;
  60.     }
  61.     dp[v][m[v]][0] = 0;
  62. }
  63.  
  64. void Trace(int v, int p)
  65. {
  66.     if (p != 0)
  67.         cout << v << " ";
  68.     if (p <= 1)
  69.         return;
  70.     for (int i = m[v]; i; --i)
  71.     {
  72.         Trace(adj[v][i], par[v][i][p]);
  73.         p -= par[v][i][p];
  74.     }
  75. }
  76.  
  77. void Solve()
  78. {
  79.     fill_n(&dp[0][0][0], N * N * N, -Inf);
  80.     memset(par, 0, sizeof par);
  81.     dfs(1);
  82.     //cout << ans << " " << piv << "\n";
  83.     //cout << m[2] << " " << dp[2][1][2] << " " << dp[3][0][1] << "\n";
  84.     Trace(piv, p);
  85. }
  86.  
  87. int32_t main()
  88. {
  89.     ios::sync_with_stdio(0);
  90.     cin.tie(0);
  91.     cout.tie(0);
  92.     int t(1);
  93.     if (typetest)
  94.         cin >> t;
  95.     for (int _ = 1; _ <= t; ++_)
  96.     {
  97.         Read();
  98.         Solve();
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement