为什么会爆栈?
#include<iostream>
using namespace std;
int n,t,a[100005],cnt,lnk[100005],sum,du[100005];
bool f;
struct edge{
int to,nxt;
}e[400005];
void add(int x,int y){e[++cnt]=(edge){y,lnk[x]};lnk[x]=cnt;}
int dfs(int x,int fa){
if(du[x]==1)return a[x];
int now=a[x],p=0;
for(int j=lnk[x];j;j=e[j].nxt){
if(e[j].to==fa)continue;
int y=dfs(e[j].to,x);
now+=y;
if(y)p++;
}
if(p>2||p==2&&now!=sum)f=0;
return now;
}
int main(){
scanf("%d",&t);
while(t--){
sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i];
f=1;
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
du[x]++,du[y]++;
}
dfs(1,0);
if(f)printf("Yes\n");else
printf("No\n");
}
return 0;
}