把相连的都是白色的端点合并起来。
然后我们可以处理出来每个联通块的大小。

然后进行枚举,对点的颜色为黑色的点进行枚举。
讲该点变为白色,那么联通的个数就是该点本身+和他相连的联通点的个数之和,这一部分枚举即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Edge{
    int to,next;
}e[400005];
int h[100005],tot;
void add(int x,int y){

    e[tot]={y,h[x]};
    h[x]=tot++;
}
int f[100005];
int cnt[100005];
int find(int x){
    return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
    memset(h,-1,sizeof h);
    int n;cin>>n;
    string s;
    cin>>s;
    for(int i=1;i<=n-1;i++){
        f[i]=i;
        int x,y;cin>>x>>y;
        add(x,y),add(y,x);
    }
    f[n]=n;
    for(int i=1;i<=n;i++){
        for(int j=h[i];~j;j=e[j].next){
            int to=e[j].to;
            if(s[i-1]=='W'&&s[to-1]=='W') {
                int fx=find(i),fy=find(to);
                f[fx]=fy;
            }
        }
    }


    int ans=0;
    for(int i=1;i<=n;i++){
        int fa=find(i);
        ++cnt[fa];
        ans=max(ans,cnt[fa]);
    }
    for(int i=1;i<=n;i++){
        if(s[i-1]=='B'){
            int sum=1;
            for(int j=h[i];~j;j=e[j].next){
                int to=e[j].to;
                if(s[to-1]=='W') sum+=cnt[find(to)];
                else continue;
            }
            ans=max(ans,sum);
        }
    }
    cout<<ans<<endl;
    return 0;
}