依然是扩展域并查集,思路与食物链完全相同,略简单于食物链
抓住要点
我朋友的朋友是我的朋友;
我敌人的敌人也是我的朋友。
迎刃而解
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
int f[maxn<<1],n,m,ans;
inline int find(int k)
{
if(f[k]==k) return f[k];
return f[k]=find(f[k]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
f[i]=i;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char c;
int x,y;
scanf("%s%d%d",&c,&x,&y);
if(c=='F')
{
f[find(x)]=find(y);
}
else
{
f[find(y+n)]=find(x);
f[find(x+n)]=find(y);
}
}
for(int i=1;i<=n;i++)
if(f[i]==i) ans++;
printf("%d",ans);
return 0;
}