题目描述
给定一棵树,结点由 1 至 n 编号,其中结点 1 是树根。树的每个点有一个颜色 Ci。
如果一棵树中存在的每种颜色的结点个数都相同,则我们称它是一棵颜色平衡树。
求出这棵树中有多少个子树是颜色平衡树。
思路
(map作返参的用法感觉挺少用的,题目倒不难想。虽然当时也是抱着试一试的态度写的。)
由于颜色的数值是离散的,我们可以使用map记录各颜色数量,聚合一下。然后dfs,先算出所有子树的颜色,然后加上当前根结点的颜色,再判断所有种类的颜色数量是否相等。如果数量都相等,则ans++。然后把当前树的map颜色记录作为返回值返回就行。
代码
#include<bits/stdc++.h>
using namespace std;
vector<int>son[200005];
int color[200005];
int ans=0;
map<int,int>dfs(int u){
map<int,int> mp;
map<int,int>temp;
for(auto it:son[u]){
temp=dfs(it);
for(auto it1:temp){
mp[it1.first]+=temp[it1.first];
}
}
mp[color[u]]++;
int k=-1;
int flag=1;
for(auto it:mp){
if(k==-1){
k=it.second;
}else {
if(k!=it.second){
flag=0;break;
}
}
}
ans+=flag;
return mp;
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++){
int a,p;cin>>a>>p;
color[i]=a;
son[p].push_back(i);
}
dfs(1);
cout<<ans;
}