链接 :http://codeforces.com/contest/1388/problem/C
题意: 有若干个人,树根为1,从根开始往下走,心情可能会变坏,坏心情不可能变好,
每个城市有个happyness值,问你这个图成不成立,
题解 :dfs树一下,因为dfs树是从下向上回溯,所以反过来,考虑好心情不能变坏即可,
同时手玩一下奇数偶数的问题就可以了。
#include<bits/stdc++.h> #define pb push_back #define fi first #define se second #define io std::ios::sync_with_stdio(false) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int P = 1e9+7, INF = 0x3f3f3f3f; const int maxn=1e5+10; std::vector<int> a[maxn]; int h[maxn]; int p[maxn]; int b[maxn]; int siz[maxn]; int flag; void dfss(int u,int fa=0) { siz[u]=p[u]; for(int i=0;i<a[u].size();i++) { int v=a[u][i]; if(v==fa) continue; dfss(v,u); siz[u]+=siz[v]; b[u]+=b[v]; } if(abs(h[u])%2!=siz[u]%2) flag=1; if(abs(h[u])>siz[u]) flag=1; int x=(h[u]+siz[u])/2; if(b[u]>x) flag=1; b[u]=x; } /*void dfs(int u,int fa=0) { for(int i=0;i<a[u].size();i++) { int v=a[u][i]; if(v==fa) continue; dfs(v,u); } } */ int main() { io; int n,m; int t; cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) { a[i].clear(); siz[i]=0; b[i]=0; } flag=0; 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; a[x].push_back(y); a[y].push_back(x); } // dfss(1); dfss(1); if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; } }