思路:
第一个判断条件:
设经过某个点的总人数为sum[u],幸福指数h[u],开心的人数good,不开心的人数bad。
g
o
o
d
+
b
a
d
=
s
u
m
g
o
o
d
−
b
a
d
=
h
good+bad=sum\\good-bad=h
good+bad=sumgood−bad=h
根据以上式子我们可以推出
2
∗
g
o
o
d
=
s
u
m
+
h
2*good=sum+h
2∗good=sum+h
也就是说good是偶数,这是我们其中的一个判断条件。
第二个判断条件:
子节点所有的开心人数不超过父节点的开心人数。因为好心情只能变成坏心情,而坏心情维持不变。
第三个判断条件:
好心情人数是不可能大于这个点的总人数的。
以上,所有情况我们都考虑到了。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define endl '\n'
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(case, x) cout << case << " : " << x << endl
#define open freopen("ii.txt", "r", stdin)
#define close freopen("oo.txt", "w", stdout)
#define IO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0)
#define pb push_back
using namespace std;
//#define int long long
#define lson rt << 1
#define rson rt << 1 | 1
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<long long, long long> PII;
const int maxn = 1e6 + 10;
int p[maxn], h[maxn], good[maxn],sum[maxn];
vector<int> edge[maxn];
bool flag = true;
void dfs(int u,int fa){
sum[u] = p[u];
int sum_good = 0;
for(auto v:edge[u]){
if (v == fa) continue;
dfs(v, u);
sum[u] += sum[v];//计算经过u的所有人数
sum_good += good[v];//计算u子节点的好心情人数
}
good[u] = (sum[u] + h[u]) / 2;
if ((sum[u] + h[u]) % 2) flag = false;
if (sum_good > good[u]) flag = false;
if (good[u] > sum[u]) flag = false;
}
void solve() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n;++i){
edge[i].clear();
}
for (int i = 1; i <= n; ++i) cin >> p[i];
for (int i = 1; i <= n; ++i) cin >> h[i];
for (int i = 1; i < n;++i){
int x, y;
cin >> x >> y;
edge[x].push_back(y);
edge[y].push_back(x);
}
flag = true;
dfs(1, -1);
if (flag) cout << "YES\n";
else
cout << "NO\n";
}
int main(){
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}