并查集问题

来源:互联网 发布:unity3d 手机摇杆 编辑:程序博客网 时间:2024/05/17 02:22

合并两个不相交集合

操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。 那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它。

void Union(int x,int y){    fx = getfather(x);    fy = getfather(y);    if(fy!=fx)       father[fx]=fy;}


获取父亲元素

int getfather(int v){    if (father[v]==v)      return v;    else    {        father[v]=getfather(father[v]);//路径压缩        return father[v];     }}


判断两个元素是否属于同一集合

bool same(int x,int y){   return getfather(x)==getfather(y);}

并查集的优化

fillchar(rank,sizeof(rank),0);
void judge(int x ,int y) {     fx = getfather(x);     fy = getfather(y);      if (rank[fx]>rank[fy])        father[fy] = fx;     else     {        father[fx] = fy;        if(rank[fx]==rank[fy])           ++rank[fy];     }}


原创粉丝点击