提交时间:2022-08-18 10:57:20

运行 ID: 55401

#include<bits/stdc++.h> #define int long long using namespace std; inline int read(){ int x=0,f=0;char c=getchar(); while(!isdigit(c))f|=(!(c^'-')),c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } int t,n,m,kk,tf,p[100005],h[100005],b[100005],k[100005]; vector<int>edge[100005]; bool a[100005]; inline void dfs(int x){ a[x]=1,b[x]=p[x]; for(int i=0;i<edge[x].size();i++){ if(!a[edge[x][i]]){ dfs(edge[x][i]); b[x]+=b[edge[x][i]]; } } } inline bool check(int x){ int cnt=0,tf=1; a[x]=1; for(int i=0;i<edge[x].size();i++){ if(!a[edge[x][i]])tf=check(edge[x][i]),cnt+=k[edge[x][i]]; } return tf&&(cnt>=k[x]-p[x]); } signed main(){ t=read(); while(t--){ for(int i=1;i<=kk;i++)edge[i].clear(),a[i]=b[i]=0; tf=1; n=kk=read(),m=read(); for(int i=1;i<=n;i++)p[i]=read(); for(int i=1;i<=n;i++)h[i]=read(); for(int i=1,x,y;i<n;i++){ x=read(),y=read(); edge[x].push_back(y); edge[y].push_back(x); } dfs(1); for(int i=1;i<=n;i++)k[i]=(b[i]-h[i])>>1; for(int i=1;i<=n;i++){ if(abs(h[i])>b[i]||(b[i]-h[i])&1){puts("NO");tf=0;break;} } memset(a,0,sizeof a); if(tf)puts(check(1)?"YES":"NO"); } return 0; }