#include #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; const ll INF = ll(1e18) + 5; ll dp[int(1e5) + 5][2]; ll a[int(1e5) + 5], b[int(1e5) + 5]; vector> tree(int(1e5) + 5); void dfs(int t, int p) { for (int child : tree[t]) { if (child == p) { continue; } dfs(child, t); } //消された場合 dp[t][0] = a[t]; //消されずに残った場合 dp[t][1] = 0; for (int child : tree[t]) { if (child == p) { continue; } if (dp[child][0] > dp[child][1]) { dp[t][0] += dp[child][0]; } else { dp[t][0] += dp[child][1]; } if (dp[child][0] > dp[child][1] + b[t] + b[child]) { dp[t][1] += dp[child][0]; } else { dp[t][1] += dp[child][1] + b[t] + b[child]; } } } int main() { int N; cin >> N; rep(i, N) { cin >> a[i]; } rep(i, N) { cin >> b[i]; } rep(i, N - 1) { int u, v; cin >> u >> v; --u; --v; tree[u].push_back(v); tree[v].push_back(u); } dfs(0, -1); cout << max(dp[0][0], dp[0][1]) << endl; return 0; }