博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集模板
阅读量:5275 次
发布时间:2019-06-14

本文共 857 字,大约阅读时间需要 2 分钟。

模板1:

这里也可以应用一个简单的启发式策略——按秩合并。该方法使用秩来表示树高度的上界,在合并时,总是将具有较小秩的树根指向具有较大秩的树根。简单的说,就是总是将比较矮的树作为子树,添加到较高的树中。简单的说,就是总是将比较矮的树作为子树,添加到较高的树中。为了保存秩,需要额外使用一个与 parent 同长度的数组,并将所有元素都初始化为 0。

1 const int maxn=505; 2 int parent[maxn],rank_[maxn]; 3 //构造并查集 4 void p(int n) 5 { 6     for(int i=0;i
rank_[y])24 parent[y]=x;25 else26 {27 parent[x]=y;28 if(rank_[x]==rank_[y])29 rank_[y]++;30 }31 }

 

模板2:

除了按秩合并,并查集还有一种常见的策略,就是按集合中包含的元素个数(或者说树中的节点数)合并,将包含节点较少的树根,指向包含节点较多的树根。这个策略与按秩合并的策略类似,同样可以提升并查集的运行速度,而且省去了额外的 rank_ 数组。

这样的并查集具有一个略微不同的定义,即若 parent 的值是正数,则表示该元素的父节点(的索引);若是负数,则表示该元素是所在集合的代表(即树根),而且值的相反数即为集合中的元素个数。

如果要获取某个元素 x 所在集合包含的元素个数,可以使用 -parent[find(x)] 得到。

1 const int maxn=505; 2 int parent[maxn],rank_[maxn]; 3 void p(int n) 4 { 5     for(int i=0;i

 

转载于:https://www.cnblogs.com/zuiaimiusi/p/10729341.html

你可能感兴趣的文章
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
Linux发行版的排行
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>