P1892 [BOI2003]团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+10;
int p[N+N];
int find(int x){
if(p[x]!=x) return p[x]=find(p[x]);
return p[x];
}
//若a和b是敌人,b和c是敌人,将a与b+n相连,b+n与c相连,则实现a和c相连
//用二倍数组表示敌人关系,一倍数组表示朋友关系
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=2*n;i++) p[i]=i;
for(int i=1;i<=m;i++){
char op[2];
cin>>op;
if(*op=='E'){
int a,b;
scanf("%d %d",&a,&b);
p[find(a+n)]=find(b);//a和b是敌人
p[find(b+n)]=find(a);//b和a是敌人
}
else{
int a,b;
scanf("%d %d",&a,&b);
int pa=find(a);
int pb=find(b);
p[pa]=pb;
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(p[i]==i) cnt++;//每一个pi=i则代表一个团体还存在
}
printf("%d\n",cnt);
return 0 - 0 ;
}