并查集

作者: Claire_cc | 来源:发表于2018-12-02 16:54 被阅读0次

例题洛谷P2978
用途:判断图中有几个连通块
1.int pre[1000]; 记录了每个人的上级是谁。如果一个人的上级就是他自己,那说明他就是队长,一个块只能有一个队长
2.查找

int find(int x)                       
{
   if(pre[r]==r)
        return r;
    else find(pre[r]);                   
}

3.合并

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

4.路径压缩
因为不关心连通的结构,有可能是个很长的链状结构,理想的状况是,所有人的上级都是自己队伍里面的队长,这样需要只要一次操作就能判断是否是一个队伍的。
因此,每次根据每个点查找到队长后将该点的上级设为队长。
同时为了使合并后的树不再退化,即合并后层数尽量不变,可以用rank[1000]表示树的层数

改进后的代码

int pre[1000];
int rank[1000];
//初始化
for(int i=0;i<n;i++)
{
   pre[i]=I;
   rank[I]=0;
}
//查找函数
int find(int x)     
{
   if(pre[x] == x){       
       return x;      
   }
   return pre[x] =find (pre[x]);   
}
//合并函数
void Union(int i,int j)
{
   i=find(i);
   j=find(j);
   if(i==j) return ;
   if(rank[i]>rank[j]) pre[j]=i;
   else
   {
       if(rank[i]==rank[j]) rank[j]++;  
       pre[i]=j;
   }
}

相关文章

  • markdown学习

    #并查集 ##并查集的定义 ##并查集的操作

  • 算法模板(四)并查集

    并查集 路径压缩并查集

  • 并查集入门使用

    本文参考自《算法笔记》并查集篇 并查集的定义 什么是并查集?并查集可以理解为是一种维护数据集合的结构。名字中并查集...

  • 并查集练习

    并查集 参考《算法笔记》 三要素:并,查,集。 并差集与一个算法有关,kruskal算法,就可通过并查集实现。 1...

  • 并查集

    并查集 并查集是什么 并查集是一种用来管理元素分组情况的数据结构,并查集可以高效地进行如下操作: 查询元素a和元素...

  • 数据结构与算法(十二)并查集(Union Find)

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化Quick FindQuick Union基...

  • 并查集

    并查集是什么 并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以...

  • 并查集

    开始时让每个元素构成一个个单元素集合(注意初始化时应使每个元素各成一组)按照一定顺序将属于同一组元素所在的集合合并...

  • 并查集

  • 并查集

    并查集 https://blog.csdn.net/liujian20150808/article/details...

网友评论

      本文标题:并查集

      本文链接:https://www.haomeiwen.com/subject/jcwjcqtx.html