曾格的github

并查集的一些理解

并查集:一种树型的数据结构,用于处理不交集的合并及查询问题。

先直接给出代码:

 1 // 初始化F[i]=i;即每个节点的父节点都是自己
 2 
 3 // 查找一个数据属于哪一个集合,也就是返回这个集合的根节点
 4 int find(int x){
 5 // 查找根节点,根节点就代表着一个集合
 6 int b=x;
 7 while(F[x]!=x) x=F[x];
 8  // 路径压缩,将路径上的每个点指向根节点x
 9 while(F[b]!=x){
10 int p=F[b];    // 当前节点的父节点
11 F[b]=x;       // 本节点指向根节点
12 b=p;           // 因为当前元素可能是热元素,为加速这个元素的查找,父节点也要继续指向根节点哦;
13 // 子节点的话还是先跟在我后面吧,下次查到你或你的子孙节点再说;
14 }
15 return x;
16 }
17 
18 // 合并集合:把两个根节点合并(一个根节点做为另一个根节点的子节点)
19 int Union(int x,int y){
20 F[find(x)]=find(y);
21 return find(y);
22 }
23  

假设我们现在有6个集合{0}{1}{2}{3}{4}{5},

  • 先合并0和1:F[0]=1;    1->0  
  • 再合并0和2:F[1]=2;     2->1->0
  • 再合并0和3:F[2]=3;     3->2->{1,0}

 

如果需要统计集合的个数,以及集合中元素的个数,那就这么改

 

 

posted @ 2021-11-04 15:35  曾格  阅读(48)  评论(0编辑  收藏  举报
Live2D