void init(int n) //初始化数组
{
for(int i=1;i<=n;i++)
f[i]=i; //f数组记录每个数的父亲,初始化每个数的父亲为它本身
}
int find(int x) //用于查找x的父亲
{
return f[x]==x?x:find(f[x]); //如果x的父亲是它本身,则直接返回x
//如果不是它本身,就找它父亲的父亲
}
void bing(int a,int b) //用于将a、b两数合并到一个集合
{
int t1=find(a); //t1为a的父亲
int t2=find(b); //t2为b的父亲
if(t1!=t2) //如果两个数的父亲不同,说明两个数属于不同的集合
f[t2]=t1; //则将t2的父亲变为t1,此时a的父亲为t1,b的父亲也为t1,a,b属于同一个集合
}
最后只需找f[i]!=i的个数即为集合个数