提交时间:2022-08-18 11:23:15

运行 ID: 55478

#include<bits/stdc++.h> using namespace std; int p[100005],h[100005],b[100005],k[100005],t,n,m; vector<int>e[100005]; bool vis[100005]; template<typename T>void in(T &a) { T ans=0; bool f=0; char c=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1; for(;c>='0'&&c<='9';c=getchar())ans=ans*10+c-'0'; a=(f?-ans:ans); } void dfs1(int pos){ vis[pos]=1,b[pos]=p[pos]; for(int i=0;i<e[pos].size();i++)if(!vis[e[pos][i]])dfs1(e[pos][i]),b[pos]+=b[e[pos][i]]; } bool dfs2(int pos){ vis[pos]=1; int sum=0; bool ans=1; for(int i=0;i<e[pos].size();i++)if(!vis[e[pos][i]])ans&=dfs2(e[pos][i]),sum+=k[e[pos][i]]; return ans&&sum+p[pos]>=k[pos]; } int main(){ in(t); while(t--){ in(n),in(m); for(int i=1;i<=n;i++)in(p[i]); for(int i=1;i<=n;i++)in(h[i]); for(int i=1,u,v;i<n;i++)in(u),in(v),e[u].push_back(v),e[v].push_back(u); dfs1(1); for(int i=1;i<=n;i++){ if(abs(h[i])>b[i]||(b[i]-h[i])%2){ puts("NO"); goto tag; } } for(int i=1;i<=n;i++)k[i]=(b[i]-h[i])/2; memset(vis,0,sizeof(vis)),puts(dfs2(1)?"YES":"NO"); tag:for(int i=1;i<=n;i++)e[i].clear(); memset(vis,0,sizeof(vis)),memset(b,0,sizeof(b)),memset(k,0,sizeof(k)); } return 0; }