并查集的模板 find()函数的定义 连接的操作 需要注意的是初始化和p[y]=x的顺序不能颠倒!
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=1000+10;
int a[maxn]; //测试数组
int p[maxn]; //使用时要初始化
//find模板
int find(int x){
return x==p[x]?x:p[x]=find(p[x]);//满足p[x]=x的说明为根 即代表元 找到后返回 (这里用到了路径压缩 加快查找速度)
}
int main(){
int n=6;
//初始化 i可能等于n 这时候会越界 可以将循环放大些
//各元素此时的代表元为本身
for(int i=0;i<n;i++)
p[i]=i;
//下面操作将3和5连接
int x=find(3),y=find(5);
if(x!=y) p[y]=x; //代表元不同 说明属于不同集合 连接之 p[y]与x的位置不能颠倒!
//数据输出
for(int i=0;i<n;i++)
cout<<i<<" "<<p[i]<<endl;
system("pause");
return 0;
}