计算出这个城市的人最多有多少个团伙
并查集,注意敌人的敌人。
#include
#include
using namespace std;
int n,f[2001],ans,m;
int getf(int x){return (f[x]==x)?x:f[x]=getf(f[x]);}
void uni(int x,int y){
int fa=getf(x),fb=getf(y);
if (fa!=fb) f[fa]=fb;
}
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
n=in(); m=in();
for (int i=1;i<=2*n;i++) f[i]=i;
for (int i=1;i<=m;i++){
char w=' ';
while (!isalpha(w)) w=getchar();
int x=in(),y=in();
if (w=='F') uni(x,y); else uni(x+n,y),uni(y+n,x);//敌人的敌人
}
for (int i=1;i<=n;i++) if (f[i]==i) ans++;
printf("%d",ans); return 0;
}
#include
#include
using namespace std;
int n,f[2001],ans,m;
int getf(int x){return (f[x]==x)?x:f[x]=getf(f[x]);}
void uni(int x,int y){
int fa=getf(x),fb=getf(y);
if (fa!=fb) f[fa]=fb;
}
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
n=in(); m=in();
for (int i=1;i<=2*n;i++) f[i]=i;
for (int i=1;i<=m;i++){
char w; int x,y;
w=in(); x=in(); y=in();
if (!w) uni(x,y); else uni(x+n,y),uni(y+n,x);//敌人的敌人
}
for (int i=1;i<=n;i++) if (f[i]==i) ans++;
printf("%d",ans); return 0;
}