您的位置:首页 > 理论基础 > 数据结构算法

并查集 数据结构

2017-02-27 13:15 330 查看
并查集(用树形结构实现的)

有2种操作:

(1)查询元素a和元素b是否在同一组。

(2)合并元素a和元素b所在的组。

int pre
;//我们用数组下标代表每个元素,而数组pre
代表N父亲的编号,

int rank
; //rank
代表这个树的高度       // 当pre
=N时,N就是所在树的根

void init(void)

{

       for(i=0;i<n;i++)

       {

             pre[i]=i;

             rank[i]=1;

       }

}

int find(int x)//找根节点,如果pre[x]==x,那么x就是其根节点

{                                 //否则,找pre[x]的父亲节点也就是pre[pre[x]],看看是否等于x。。。

         return pre[x]==x?x:find(pre[x]);

}

void unite(int x,int y)

{

        int root1,root2;

        root1=find(x);//找到2个元素各自的根节点root1,root2

        root2=find(y);

        if(root1==root2)//如果根节点相同,那就不用合并

             return ;

        if(rank[root1]<rank[root2])//b=比较2个树的高度,把小树合并到大树上

             pre[root1]=root2;//把小树的根节点的父亲节点指向大树的根节点root2

        else

        {

              pre[root2]=root1;

              if(rank[root1]==rank[root2])//如果2棵树高度相同,合并之后,高度会增加一

              rank[root1]++;

        }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息