并查集

并查集是一种高效处理不相交集合合并与查询的数据结构,常用于判断元素间关系。通过查找和合并两个主要操作,可以快速确定元素是否属于同一集合,避免形成环。初始化时,节点的根设为-1。查找操作通过递归调用找到根节点,合并操作将两个集合的根节点指向同一个,以完成合并。在处理复杂关系网络时,能简化判断过程。
摘要由CSDN通过智能技术生成

并查集:并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。

这是我百度的关于并查集的定义,在我看来并查集是把一些有关系的元素放到一个集合,这样我们就可以判断任意元素间的关系。
在这里插入图片描述

在这里插入图片描述
这样我们就可以先利用已知的关系创建并查集,然后判断元素间的关系。例如有的题就会给你一堆已知关系,a和b是亲戚,b和c是亲戚,d和f是亲戚…让你判断随意给出的两个人存不存在亲戚关系。
当关系网比较庞大时我们人为比较难判断,用并查集就很好解决。
创建并查集我们需要先创建一个和节点数数量一致的数组,数组parent[],数组表示下标对应的节点的根为哪个节点。
如:在这里插入图片描述

并查集主要有两种操作:1,查找
2,合并
查找是为了找到操作节点的根,合并是把两个节点或和他们有关的节点放到一个集合。
首先先初始化一个数组:

int parent[max_size]
for(int i=1;i<=max_size;i++)//初始化 节点的父亲
{
   	parent[i]=-1;//把节点的根都设为-1
}

查找根

int find_root(int v)//传入需要查找根的节点
{
    if(parent[v]==-1) return v;//若没有给他传入根,则它的根就是它本身
    else
    {
        parent[v]=find_root(parent[v]);//压缩找父节点的路径
        return parent[v];
    }
}

合并:

int union(int x,int y)
{
int x_root,y_root;
x_root=find(x);
y_root=find(y);
if(x_root!=y_root)//要合并的两个节点不在同一集合,可以进行合并
{
	parent[x_root]=y_root;//把其中一个节点的根设为另一个节点的根,即完成了合并操作。
	return 1;//表示合并成功
}
else//要合并的两个节点在同一集合,不能进行合并,这里可以用来判断节点间是否形成了环
{
	return 0;
}
}

这样的图就形成了环
在这里插入图片描述
而这样的就没有环
在这里插入图片描述
我们在导入已知关系时,可以用union(),检查某两点间是否形成了环也是union这两点,若合并失败说明形成了环。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值