https://codeforces.com/contest/1118/problem/F1
#include<bits/stdc++.h> using namespace std; int n; vector<int> color; vector<vector<int> > tree; int red=0,blue=0; int ans=0; pair<int,int> dfs(int v,int p=-1){ int r=(color[v]==1); int b=(color[v]==2); for(int i=0;i<tree[v].size();i++){ int u=tree[v][i]; if(u!=p){//避免回溯到上一个经过的点 pair<int,int> tmp=dfs(u,v); ans+=(tmp.first==red&&tmp.second==0);//只有之前经过的点中包含了全部的红或者蓝点才可以 ans+=(tmp.first==0&&tmp.second==blue); r+=tmp.first;//加上之前点中的红和蓝点 b+=tmp.second; } } return make_pair(r,b); } int main(){ cin>>n; color.resize(n); for(int i=0;i<n;i++){ cin>>color[i]; if(color[i]==1) red+=1; else if(color[i]==2) blue+=1; } tree.resize(n); for(int i=0;i<n-1;i++){ int a,b; cin>>a>>b; a--;b--; tree[a].push_back(b); tree[b].push_back(a); } dfs(0); cout<<ans<<endl; return 0; }