递归方法路径压缩:
int find(int x)
{if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
上面代码可能会RE;建议用下面的代码:
int findset(int x)
{
int r = x;
while(father[r]!=r) ///查找跟节点
r = father[r]; ///找到根节点,用r记录
int i = x,j;
while(i != r) ///非递归路径压缩
{
j = father[i]; ///用j暂时存father[i]的父节点
father[i] = r; ///father[i]指向跟节点
i = j; ///i移到父节点
}
return r; ///返回根节点的值
}