这道题不难看出是并查集所以:
int find(int x){
if(f[x]!=x)f[x]=find(f[x]);//查找+路径压缩,如果没有祖先就回溯
return f[x];
}
如果a是b的朋友那么
f[find(a)]=find(b);
r如果a是b的敌人那么:
f[find(a+n)]=find(b);
所以 ::
#include<bits/stdc++.h>
using namespace std;
int f[2500];//并查集
int find(int x){
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=2*n;i++){
f[i]=i;//初始化
}
for(int i=1;i<=m;i++){
int a,b;
char ch;
cin>>ch>>a>>b;
if(ch=='F'){
f[find(a)]=find(b);//朋友合并
}else{
f[find(a+n)]=find(b);
f[find(b+n)]=find(a);//敌人合并
}
}
int s=0;祖先数 团伙数
for(int i=1;i<=n;i++){
if(f[i]==i) s++;
}
cout<<s;
}