Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <vector>
- #include <algorithm>
- #include <string.h>
- #include <map>
- using namespace std;
- #define ll long long
- #define LL long long
- #define sl(n) scanf("%lld", &n)
- #define sf(n) scanf("%lf", &n)
- #define si(n) scanf("%d", &n)
- #define ss(n) scanf("%s", n)
- #define pii pair <int, int>
- #define pll pair <ll, ll>
- #define plp pair <int, pll >
- #define pb push_back
- #define inf (1LL<<60)
- #define fr first
- #define sc second
- #define EPS 0.0000000001
- vector <ll> ed[210];
- ll dp[210][210][2], a[210];
- ll n, k;
- void dfs(ll u, ll par)
- {
- for (ll i = 0; i <= k; i++)
- dp[u][i][0] = dp[u][i][1] = a[u];
- for (ll i = 0; i < ed[u].size(); i++)
- {
- ll v = ed[u][i];
- if (v != par)
- {
- dfs(v, u);
- for (ll j = k; j >= 1; j--)
- {
- for (ll lj = 1; lj <= j; lj++)
- {
- if (lj >= 2)
- dp[u][j][0] = max(dp[u][j][0], dp[u][j-lj][0] + dp[v][lj-2][0]);
- dp[u][j][1] = max(dp[u][j][1], dp[u][j-lj][0] + dp[v][lj-1][1]);
- if (lj >= 2)
- dp[u][j][1] = max(dp[u][j][1], dp[u][j-lj][1] + dp[v][lj-2][0]);
- }
- }
- }
- }
- }
- int main ()
- {
- // #ifndef zeron
- // freopen("inl.txt", "r", stdin);
- // freopen("outu.txt", "w", stdout);
- // #endif
- // ios_base::sync_with_stdio(0); // no printf/scanf must be present
- ll cs, t, i, j, x, y, z, ans, q;
- for (cs = 1; sl(n) != EOF; cs++)
- {
- sl(k);
- for (i = 0; i <= n; i++)
- {
- ed[i].clear();
- }
- for (i = 1; i <= n; i++)
- sl(a[i]);
- for (i = 1; i < n; i++)
- {
- sl(x);
- sl(y);
- ed[x].pb(y);
- ed[y].pb(x);
- }
- dfs(1, 0);
- ans = max(dp[1][k][0], dp[1][k][1]);
- printf("%lld\n", ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement