1 条题解

  • 0
    @ 2025-11-3 0:09:35

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    
    bool flag;//记录能否获得全部宝物 
    int t,n,b;//b 代表树上共有多少个节点有宝物 
    int a[100005];
    vector <int> vec[100005];
    
    int search(int x,int f)//返回以 x 为根节点的树(子树)共有多少个结点有宝物。f 代表 x 的父亲节点。 
    {
    	if(vec[x].size()==1&&vec[x][0]==f)
    	{
    		return a[x];
    	}
    	int ans=0,p=0;//ans 记录所有以 x 为根节点的子树的宝物总数,p 记录以 x 的子节点为根的子树中有多少棵子树有宝物 
    	for(int i:vec[x])//遍历节点 x 的所有边 
    	{
    		if(i!=f)
    		{
    			int l=search(i,x);
    			if(l)
    			{
    				p++;
    				ans+=l;
    			}
    		}
    	}
    	ans+=a[x];
    	if((ans!=b&&p>1)||p>2)flag=false;//发现不幸点 
    	return ans;
    }
    
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		flag=true;
    		b=0;
    		cin>>n;
    		for(int i=1;i<=n;i++)
    		{
    			vec[i].clear();//多测要清空 
    			cin>>a[i];
    			if(a[i])b++;
    		}
    		for(int i=1;i<n;i++)
    		{
    			int x,y;
    			cin>>x>>y;
    			vec[x].push_back(y);
    			vec[y].push_back(x);
    		}
    		search(1,0);//树的根节点可以随便取一个 
    		if(flag)
    		{
    			cout<<"Yes"<<endl;
    		}
    		else
    		{
    			cout<<"No"<<endl;
    		}
    	}
    }
    
    
    • 1

    信息

    ID
    5626
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者