白魔法师
白魔法师
https://ac.nowcoder.com/acm/contest/5600/C
把相连的都是白色的端点合并起来。
然后我们可以处理出来每个联通块的大小。
然后进行枚举,对点的颜色为黑色的点进行枚举。
讲该点变为白色,那么联通的个数就是该点本身+和他相连的联通点的个数之和,这一部分枚举即可。
#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;
}
