具体完整代码详见我的解答
并查集(核心代码)
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);//通过递归找到x所属树下面的根节点
return p[x];//返回根节点
}
//压缩路径,合并两个集合
void merge(int a,int b)
{
a=find(a),b=find(b);//找到A与B的根节点
if(a==b) return;//a与b相等直接返回
if(r[a]>r[b]) return p[b]=a;
else
{
b=p[a];//将a接到了b的树根下面,即将小的接到大的下面,这样可以减少递归的长度
if(r[a]==r[b]) r[b]++;//如果两个一样长,但是接到了b的下面所以需要给b树的长度加1.
}
}