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