并查集水题。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int maxn=2*5000+5;
int fa[maxn],rank[maxn];
int cnt=0;
bool used[maxn];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
x=find(x),y=find(y);
if(x==y) return;
if(rank[x]>rank[y]) fa[y]=x;
else
{
fa[x]=y;
if(rank[x]==rank[y]) rank[y]++;
}
return ;
}
int main()
{
memset(used,0,sizeof(used));
memset(rank,0,sizeof(rank));
scanf("%d%d",&n,&m);
for(int i=1;i<=n*2;i++) fa[i]=i;
char a[1];
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",&a,&x,&y);
if(a[0]=='F') merge(x,y);
else
{
merge(x+n,y);
merge(x,y+n);
}
}
for(int i=1;i<=n;i++)
{
x=find(i);
if(!used[x])
{
cnt++;
used[x]=1;
}
}
printf("%d",cnt);
return 0;
}