并查集:一种树型的数据结构,用于处理不交集的合并及查询问题。
先直接给出代码:
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}
如果需要统计集合的个数,以及集合中元素的个数,那就这么改