#include<bits/stdc++.h>
using namespace std;
int col[100001];
struct tree{
int k;
int f;
}node[100001];
queue<int> q;
int main(){
int n;
cin>>n;
int whitecnt=0;
for(int i=1;i<=n;i++){
cin>>col[i];
if(!col[i])whitecnt++;
}
for(int i=1;i<n;i++){
int l,r;
cin>>l>>r;
node[r].f=l;
node[l].k++;
}
for(int i=1;i<=n;i++){
if(!node[i].k&&!col[i])q.push(i);
}
while(!q.empty()){
int p=q.front();
q.pop();
node[node[p].f].k--;
whitecnt--;
if(!col[node[p].f]&&!node[node[p].f].k)q.push(node[p].f);
}
cout<<whitecnt;
return 0;
}
QAQ 发表于 2024-08-23 12:06 回复楼主 #include<bits/stdc++.h> using namespace std; int col[100001]; struct tree{ int k; int f; }node[100001]; queue q; int main(){ int n; cin>>n; int whitecnt=0; for(int i=1;i<=n;i++){ cin>>col[i]; if(!col[i])whitecnt++; } for(int i=1;i<n;i++){ int l,r; cin>>l>>r; node[r].f=l; node[l].k++; } for(int i=1;i<=n;i++){ if(!node[i].k&&!col[i])q.push(i); } while(!q.empty()){ int p=q.front(); q.pop(); node[node[p].f].k--; whitecnt--; if(!col[node[p].f]&&!node[node[p].f].k)q.push(node[p].f); } cout<<whitecnt; return 0; } 思路:白色叶节点入队 将所有白色叶节点删除,将他们的爸爸的孩子数量统计都-1,再看还有木有白色孩子数量为0的节点