题解:
让一个二维数组存一下他的敌人
举例:ans[i][0] 就是i的敌人的个数,然后a[i][j]就是指他第j个敌人。
#include<iostream>
#include<cstdio>
#define X 10000+7
using namespace std;
int fa[X],ans[X][X];
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int hb(int x,int y)
{
int ff=find(x),fff=find(y);
fa[ff]=fff;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
fa[i]=i;
char a;
for(int i=1,x,y;i<=m;++i)
{
cin>>a>>x>>y;
if(a==‘F‘)hb(x,y);
if(a==‘E‘)
{
for(int j=1;j<=ans[y][0];++j)
{
hb(x,ans[y][j]);
}
for(int j=1;j<=ans[x][0];++j)
hb(y,ans[x][j]);
ans[x][++ans[x][0]]=y;
ans[y][++ans[y][0]]=x;
}
}
int k=0;
for(int i=1;i<=n;++i)
{
if(fa[i]==i)k++;
}
cout<<k;
}