关于并查集

77 阅读1分钟

并查集有三种操作:

1.初始化:

 for(int i=1; i<=n; i++)
            pre[i]=i;

把所有节点的根节点标记为自己。

2.查找:

//一种较为简单的路径压缩+查找
int find(  int x )
{
    return x == pre[x] ? x : pre[x] = find(pre[x]);     //找祖先节点 + 路径压缩
}


\

int find(int x)//找到一个集合父节点
{
    int r=x;
    while(pre[r]!=r)
        r=pre[r];

    int i=x,j;
    while(pre[i]!=r)//路径压缩,缩小寻找次数
    {
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}

找到一个元素的根节点,后面的是路径压缩,把一段很长的路压缩成可以直接一层找到的。

3.合并:

void mix(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
        pre[fy]=fx;
}

合并操作是使两个节点的根节点变成一个。

关于并查集的详解,这里有一篇博客,深入浅出:

并查集详解




\