并查集

首先我们定义一个数组,用双亲表示法来表示各棵树(所有的集合元素个数总和为N)

  int Tree[N];

用Tree[i]表示结点i的双亲结点,若Tree[i]为-1则表示根结点
那么为了查找到结点x 的根结点,设立了一下函数
递归方法:

int FindRoot(int x)
{
    if(Tree[x]==-1) return x; //如果x的双亲结点节点是-1,那么它就是根结点、
    else return FindRoot(Tree[x]); // 否则,让双亲结点找根结点;
}

非递归方法:

int FindRoot(int x)
{
    if(Tree[x]==-1) return x; //如果x的双亲结点节点是-1,那么它就是根结点、
    else {
        int tmp =Tree[x];
        while(tmp!=-1)
        {
            x=tmp; 
            tmp=Tree[x]; //不断的找双亲结点,直到找到根结点;
        }
        return x; //因为Tree[x]==-1;
    }
}

为了让树的高度降低,我们考虑路径压缩,让路径上的结点都指向根结点,以上两个代码变成


int FindRoot(int x)
{
    if(Tree[x]==-1) return x; //如果x的双亲结点节点是-1,那么它就是根结点、
    else {
        int tmp =Tree[x];
        while(tmp!=-1)
        {
            t=tmp; 
            tmp=Tree[t]; //不断的找双亲结点,直到找到根结点;
        }//t为根结点
        while(Tree[x]!=-1)
        {
            Tree[x]=t;
            x=Tree[x];
        }
        return t;
    }
}

int FindRoot(int x)
{
    if(Tree[x]==-1) return x;
    else {
        int tmp=FindRoot(Tree[x]);
        Tree[x] = tmp;
        return tmp;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • “归并排序”思想虽然很简单,但是对“归并排序”算法的学习,我们可以一窥“分治”和“递归”这两种非常常用的算法思想。...
    李威威阅读 826评论 0 1
  • 目录 1、等价关系和等价类 2、并查集实现中的权衡 2.1、快速FIND实现(Quick FIND) 2.2、快速...
    我哈啊哈啊哈阅读 1,366评论 0 0
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,612评论 0 13
  • kuangbin专题 模板 关于并查集的一点心得 大家都说带权并查集的起点是食物链( POJ - 1182 ),但...
    染微言阅读 1,541评论 0 3
  • 食禅:今天吃的饭都是非常健康的食品,红枣干果酸奶水果,清理下自己的身体很舒服 行禅:在河边走在路上和大地连接,越来...
    1b55a34bbf5b阅读 188评论 0 0

友情链接更多精彩内容