并查集之入门

  1. 并查集(Disjoint-set)
    并查集是一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构。主要涉及两种基本操作:合并和查询
    ①为了实现并查集,我们使用“代表元”法,即为每一个集合选择一个固定的元素,作为整个集合的代表。
    ②为了定于归属关系,有以下两种思路:1.维护数组f,f[x]表示元素x所在集合的代表。优点可以快速查询,缺点是合并时需要大量修改。
    2.使用一颗树形结构存储每个集合,树上的每个节点都是一个元素,树根是集合的代表元整个并查集实际上是一个森林(若干个树)
    我们可以维护数组fa,fa[x]保存x的父节点(父节点的fa值为他自己),在合并集合时,只需令fa[root1]=root2。但是查询元素归属时,需要从当前节点通过fa存储的值不断递归访问父节点,效率不高。所以引入了路径压缩按秩合并。但是实际应用中,我们使用路径压缩就够了。
    数据结构的基本操作决定了它的应用范围,对并查集而言,一个简单的应用就是判断无向图的连通分量个数,或者判断无向图中任何两个顶点是否连通。
  2. 路径压缩
    第一种思路,f数组保存代表元的查询效率高,所以可以把两种思路做一个整合。因为我们只关心每个集合对应的树形结构的根节点,并不关心这颗树长什么样子。so…………
    !!!我们可以在每次查询操作的同时,把访问过得每个节点(这个节点的所有全部祖先),都直接指向树根!
    每次查询操作的复杂度ologn
    3.并查集的具体实现
    ①并查集的存储
    使用数组fa保存父节点(根父节点的为它自己)
    ②并查集的初始化
    设有n个元素,初始所有元素各自构成一个独立的集合,即有n颗一个点的树
    for(int i=1;i<=n;++i) fa[i]=i;
    ③并查集的查询操作
    若x是树根,则x就是集合代表,否则递归访问fa[x]直至根节点
    ④并查集的合并操作
    合并元素x和元素y所在的集合,等价于让x的树根作为y的树根的子节点
查询操作
int get(int x)
{
	if(x==fa[x]) return x;
	return fa[x]=get(fa[x]);//路径压缩,fa[x]直接赋值为代表元素
}
合并操作
void merge(int x,int y)
{
	fa[get(x)]=get(y);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值