并查集压缩路径:先找到所有节点的最终的根节点,然后通过将所有不与根节点直接相连的并且父节点是根节点的节点直接接在根节点上面,从而减少查找时间,来达到时间节省的目的!
关于并查集寻找父节点的算法:主要分为两类:
一:通过递归求解。优点:代码较短,并且递归的过程中已经包含了压缩路径。缺点:数据较大的时候,容易超时,栈溢出,提交到的时候,出现RE的错误!
代码如下:
int find(int r)
{
return r==father[r]?r:find(father[r]);
}
二:通过循环来求解。缺点:需要自己单独添加路径压缩。优点:使用情况多,不再受数据大小的限制。
代码如下:
int find(int x)
{
int r=x,j;
while(r!=father[r])
r=father[r];//经过循环之后r表示最终的根节点
//下面是压缩路径
j=x;//从当前位置开始寻找
while(r!=j)
{
int k=father[j];
father[j]=r;
j=k;//从当前节点到根节点的路径上遍历,都将他们的父节点赋值为根节点
}
}原文:http://blog.csdn.net/ice_alone/article/details/41977355