1 条题解
-
0
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
- 上传者