int per[1100];
int n;
void init() //初始化节点
{
for(int i=1;i<=n;i++)
per[i]=i;
}
int find1(int x) //查找该节点的根,方法一
{
int r=x;
while(r!=per[r]) //当该节点的根与其节点编号不等时,说明该节点不是该序列的根
r=per[r]; //当该节点的根与其节点编号不等时,继续查找其父点的节点
// per[x]=r; //令所查找的节点指向根节点,该操作可在join函数中进行,此处可省
return r; //返回根节点
}
int find2(int x) //查找方法二
{
int r=x;
while(r!=per[r])
r=per[r]; //先找到根节点
int j,i=x;
while(i!=r) //把各节点均连到根节点上
{
per[i]=r; //把当前节点指向根节点
j=per[i];
i=j; //把当前节点转化为其父节点
}
return r; //返回根节点
}
int find3(int x) //查找方法三
{
if(x==per[x]) //如果当前节点为根节点,返回根节点
return x;
else return per[x]=find3(per[x]);//否则查找当前父节点的根节点,并交给当前父节点,递归算法
}
void join(int x,int y) //连接两节点
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
per(fx)=fy;
}