Skip to content

Instantly share code, notes, and snippets.

@meooow25
Last active February 26, 2019 04:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save meooow25/e84a9f1f6024a49878d12b7238b3d8a3 to your computer and use it in GitHub Desktop.
Save meooow25/e84a9f1f6024a49878d12b7238b3d8a3 to your computer and use it in GitHub Desktop.
// CLMTRO
// Author: meooow
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e15;
const int MAX_N = 5005;
int t, n, a[MAX_N], b[MAX_N];
long long k;
vector<int> g[MAX_N];
int sz[MAX_N];
vector<long long> dp0[MAX_N], dpa[MAX_N], dpb[MAX_N];
inline void imin(long long &x, long long y) { if (x > y) x = y; }
void dfs(int u, int p) {
dp0[u] = {0, INF};
dpa[u] = {INF, a[u]};
dpb[u] = {INF, INF};
sz[u] = 1;
for (int v : g[u]) if (v != p) {
dfs(v, u);
vector<long long> d0, da, db;
d0 = da = db = vector<long long>(sz[u] + sz[v] + 1, INF);
for (int i = 0; i <= sz[u]; i++) {
for (int j = 0; j <= sz[v]; j++) {
imin(d0[i + j], dp0[u][i] + min(dp0[v][j], min(dpa[v][j], dpb[v][j])));
imin(da[i + j], dpa[u][i] + dp0[v][j]);
imin(db[i + j], dpa[u][i] - a[u] + b[u] + min(dpa[v][j] - a[v] + b[v], dpb[v][j]));
imin(db[i + j], dpb[u][i] + min(dpa[v][j] - a[v] + b[v], min(dp0[v][j], dpb[v][j])));
}
}
dp0[u] = d0, dpa[u] = da, dpb[u] = db;
sz[u] += sz[v];
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
cin >> t;
while (t--) {
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> b[i];
for (int i = 0; i < n - 1; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 1);
for (int i = n; i >= 0; i--) {
if (min(dp0[1][i], min(dpa[1][i], dpb[1][i])) <= k) {
cout << i << "\n";
break;
}
}
fill_n(g, n + 1, vector<int>());
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment