用了路径压缩,代码中还用了按秩合并(已注释掉),但不知为何还是会多合并几个人。希望大佬们帮忙看看。
#include <iostream>
#include <cstdio>
using namespace std;
int fr[2010],cnt[2010];
inline int getfr(int i)
{//找代表元素
if(fr[i]==i)
{
return i;
}
//cnt[fr[i]]+=cnt[i];
return fr[i]=getfr(fr[i]);
}
/*inline bool mgr_symbol(int a,int b)
{
/*if(cnt[getfr(a)]>cnt[getfr(b)])
{
return true;
}
return false;
}*/
inline void mgr(int a,int b)
{
/*if(mgr_symbol(a,b))
{
fr[fr[b]]=fr[a];
return;
}
fr[fr[a]]=fr[b];*/
//合并,原本有一个按秩合并
fr[getfr(b)]=getfr(a);
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(register int i=1;i<=n*2;++i)
{//初始化
fr[i]=i;
}
/*for(register int i=1;i<=n;++i)
{
cnt[i]=1;
}*/
for(register int i=1;i<=m;++i)
{
char c[2];int a,b;
scanf("%s%d%d",&c,&a,&b);
if(c[0]=='F')
{//朋友间合并
mgr(a,b);
mgr(a+n,b+n);
continue;
}//仇人间合并
mgr(a,b+n);
mgr(b,a+n);
}
for(register int i=1;i<=n;++i)
{
fr[i]=getfr(i);
}
register int ans=0;
for(register int i=1;i<=n;++i)
{
if(fr[i]==i)
{
++ans;
}
}
printf("%d",ans);
return 0;
}