并查集模板

并查集是若干个不想交的集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如求无向图的连通分量个数等。

并查集的精髓就是它的三种操作:初始化、查找、合并

int father[MAX];//father[x]表示x的父节点
int rank[MAX];//rank[x]表示x的秩
void Make_set(int x)
{
    father[x]=x;
    rank[x]=0;
}
int find(int x)//查找元素所在的父节点,回溯时压缩路径
{
    if(x!=father[x])
        father[x]=find(father[x]);
    return father[x];
}
void Uion(int x,int y)//按秩合并x,y所在的集合
{
    x=find(x);
    y=find(y);
    if(x==y) return ;
    if(rank[x]>rank[y])
        father[y]=x;
    else if(rank[x]<rank[y])
        father[x]=y;
    else {
        rank[x]++;
        father[y]=x;
    }
}

注意:代码中路径压缩时秩是不需要变化的,秩只是表示节点高度的一个上界。当然rank在不同题目中,有不同的作用,例如计数。

如果秩进行计数时,路径压缩也是不需要变化。因为所属集合的根节点的秩在合并时已经更新,其他子节点的秩不用到也无需变化。

posted @ 2014-01-05 14:27  段少  阅读(210)  评论(0编辑  收藏  举报