*Codeforces Round #790 (Div. 4) G. White-Black Balanced Subtrees(树+dfs)
https://codeforces.com/contest/1676
给你一个有根的树,由从1到n的n个顶点组成,根是顶点1。还有一个字符串s表示每个顶点的颜色:如果si=B,那么顶点I是黑色的,如果si=W,那么顶点I是白色的。
如果树的白色顶点的数量等于黑色顶点的数量,则称该子树是平衡的。
树是没有圈的连通无向图。有根的树是具有选定顶点的树,该顶点被称为根。在这个问题中,所有的树都有根1。
计算平衡子树的数量。
input
3
7
1 1 2 3 3 5
WBBWWBW
2
1
BW
8
1 2 3 4 5 6 7
BWBWBWBW
output
2
1
4
#include<bits/stdc++.h>
using namespace std;
const int N=200200,M=2002;
int color[N];
vector<int> v[N];//计算该父节点下带了有谁,也就是它的下一层都有谁
int sum=0;
int dfs(int x)
{
int res=color[x];//先看一下该根节点的颜色是啥,它也算一个
//cout<<"root "<<x<<" "<<res<<endl;
for(int i=0;i<v[x].size();i++)//看一下它的子节点
{
res+=dfs(v[x][i]);
}
//cout<<"sa "<<res<<endl;
if(res==0) sum++;
return res;
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--)
{
int n;
cin>>n;
//每次都需要清空上一次的数据
sum=0;
for(int i=1;i<=n;i++)
v[i].clear();
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
v[x].push_back(i);//这里表示i的父亲节点就是x
}
//树构建完成
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
//取相对立的两个数,加起来更好判断
if(c=='B') color[i]=1;
else color[i]=-1;
}
//从根结点开始往下查找
dfs(1);
cout<<sum<<endl;
}
return 0;
}