P1892 [BOI2003] 团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
int n,m,f[N];
int res=0;
int find(int x)
{
if(f[x]==x)
return x;
return f[x]=find(f[x]);
}
void Union(int a,int b)
{
a=find(a);
b=find(b);
if(a!=b)
f[a]=b;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=2*n;i++)//1-n为朋友的集合,n+1-2n为敌人的集合
f[i]=i;
while(m--)
{
char a;
int x,y;
cin>>a>>x>>y;
if(a=='F')
{
Union(x,y);
}
else
{
if(f[x+n]!=x+n)//x已经有敌人了
{
Union(f[x+n],y);//把x的敌人与y合并成朋友
f[x+n]=y;//把x的敌人改为y;
}
else
f[x+n]=y;//x没有敌人,那么x的敌人就是y
if(f[y+n]!=y+n)//y已经有敌人
{
Union(f[y+n],x);//把y的敌人与x合并成朋友
f[y+n]=x;//把y的敌人改为x
}
else
f[y+n]=x;//y没有敌人,那么y的敌人就是x
}
}
for(int i=1;i<=n;i++)
{
if(f[i]==i)
res++;
}
cout<<res;
return 0;
}