并查集的路径压缩

来源:互联网 发布:linux命令 cp r 编辑:程序博客网 时间:2024/04/30 19:30

这是朴素查找的代码,适合数据量不大的情况:

int findx(int x){    int r=x;   while(parent[r] !=r)        r=parent[r];   return r;}

   下面是采用路径压缩的方法查找元素:

int find(int x)       //查找x元素所在的集合,回溯时压缩路径{    if (x != parent[x])    {        parent[x] = find(parent[x]);     //回溯时的压缩路径    }         //从x结点搜索到祖先结点所经过的结点都指向该祖先结点    return parent[x];}
    上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:

int find(int x){    int k, j, r;    r = x;    while(r != parent[r])     //查找跟节点        r = parent[r];      //找到跟节点,用r记录下    k = x;            while(k != r)             //非递归路径压缩操作    {        j = parent[k];         //用j暂存parent[k]的父节点        parent[k] = r;        //parent[x]指向跟节点        k = j;                    //k移到父节点    }    return r;         //返回根节点的值            }


0 0
原创粉丝点击