*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;
}
posted @ 2022-08-09 21:05  高尔赛凡尔娟  阅读(45)  评论(0编辑  收藏  举报