MLE求调
查看原帖
MLE求调
1280427
Z_Z_Y楼主2024/12/1 15:12

为什么会爆栈?

#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;
} 
2024/12/1 15:12
加载中...