一、初始化函数:
void init()
{
for(int i=1;i<=n;i++){
pre[i]=i;//每个人的上一个人的编号初始化为自身的编号
}
}
二、找根函数:
1、初始版本:
int findRoot(int x)
{
if(pre[x]==x){//找到最顶层的根节点,则返回其编号,作为当前结点的根结点编号
return x;
}
return findRoot(pre[x]);//否则一直往上找,找其最顶层的根结点
}
2、路径压缩优化版本:
//递归方式:
int findRoot(int x)
{
if(pre[x]==x){//找到最顶层的根节点,则返回其编号,作为当前结点的根结点编号
return x;
}
return pre[x]=findRoot(pre[x]);//否则一直往上找,找其最顶层的根结点,并将路径上的关联点都加到根结点上
}
//迭代方式:
int findRoot(int x)
{
int y=x,t;
while(pre[y]!=y) y=pre[y];
while(x!=y){
t=pre[x];
pre[x]=y;
x=t;//一直往上找,找其最顶层的根结点,并将路径上的关联点都加到根结点上
}
return x;
}
3、递归回溯时记录深度
int g