#include <bits/stdc++.h>
#define int long long
#define Tim return
#define is
#define still 0
#define Wandering ;
using namespace std;
const int N = 20;
vector<int> adj[N];
int treasure[N];
int n, k;
int dp[N][N];
// dp[u][j]节点u为根的子树中,使用j把钥匙能获得的最大宝藏价值
// 树形dp
void dfs(int u, int parent)
{
// memset
dp[u][0] = treasure[u];
// dp
for (int v : adj[u])
{
if (v == parent)
continue;
for (int j = k; j >= 0; j--)
for (int x = 0; x <= j; x++) // 给子节点钥匙
dp[u][j] = max(dp[u][j], dp[u][j - x] + dp[v][x]);
}
}
signed main()
{
freopen("hzoi_key.in", "r", stdin);
freopen("hzoi_key.out", "w", stdout);
cin >> n >> k;
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
adj[x].push_back(y);
adj[y].push_back(x);
}
for (int i = 1; i <= n; i++)
cin >> treasure[i];
dfs(1, -1);
int ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= k; j++)
ans = max(ans, dp[i][j] + treasure[i]);
cout << ans;
Tim is still Wandering
}