C. Uncle Bogdan and Country Happiness(DFS)
思路: 。
设经过城市
的好人为:
,拜访城市
的总人数为:
主要是找到
的表达式,这题就解决了。
根据:
找到三个限制条件:
1: 能整除
2:
3:
然后跑 。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define reg register
#define pb push_back
#define over {ok=0;return;}
int n,t,m,h[N],p[N],a[N],g[N];
bool ok;
vector<int>e[N];
void dfs(int u,int fa){a[u]=p[u];int sum=0;for(auto v:e[u]){if(v==fa) continue;dfs(v,u);sum+=g[v];a[u]+=a[v];}if((a[u]+h[u])&1) over;g[u]=(a[u]+h[u])>>1;if(!(g[u]>=0&&g[u]<=a[u])) over;if(sum>g[u]) over;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);ok=1;for(reg int i=1;i<=n;i++) scanf("%d",&p[i]);for(reg int i=1;i<=n;i++) scanf("%d",&h[i]);for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),e[u].pb(v),e[v].pb(u);dfs(1,0);puts(ok?"YES":"NO");for(int i=1;i<=n;i++) e[i].clear();}return 0;
}