题目链接:Click
-
利用vector数组储存结点之间联系 (相当于邻接表)
-
关系 g[father]>=g[son] (g[N]储存开心人的数目)
-
dfs()的实现
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+7;
vector<int> gr[N]; //储存结点之间的关系
bool access=true;
int p[N], h[N],a[N], g[N];//人数,幸福值,经过v的人数,开心的人数
void dfs(int v, int ancestor=-1){
a[v]= p[v];
int sum_g=0; //求子节点的开心人数的和
for(int to : gr[v]){
if(to==ancestor) continue; //避免死循环
dfs(to,v);
sum_g+=g[to];
a[v]+=a[to]; //求经过v的人总数
}
if((a[v]+h[v])%2==0);
else access=false;
g[v]=(a[v]+h[v])/2; //求经过v开心的人数
if(g[v]>=0&&g[v]<=a[v]);
else access=false;
if(sum_g<=g[v]);
else access=false;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int q;
cin>>q;
while(q--){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0;i<n;i++) cin>>h[i];
for(int i=0;i<n-1;i++){
int a,b; cin>>a>>b;
a--,b--;
gr[a].push_back(b);
gr[b].push_back(a);
}
dfs(0);
cout<<(access ? "YES": "NO")<<endl;
access =true;
for(int i=0;i<n;i++) gr[i].clear();
}
}