C语言 编写并查集

并查集是一种用于查找无向图环路的数据结构,通过parent数组记录节点连接,并通过搜索函数找寻根节点。文章介绍了如何实现并查集,包括合并与查询操作,并讨论了按秩合并和加速查询的优化策略,以提高效率。测试表明,优化后的并查集能有效检测图的环路情况。
摘要由CSDN通过智能技术生成

并查集是一种比较冷门的数据结构,通常用于查找无向图是否存在环。在做无向图是否有环的时,一般是用深度或者广度优先搜索遍历一遍,但是并查集提供了另一种思路。
首先需要用一个parent数组来记录该点的连接点,通过这个数组的一个位置来寻找它的最父辈的点。首先按照数组大小新建一个parent数组并将其初始化为-1,假如搜索到一个点的parent值为-1则它就是最顶点的一个。
在这里插入图片描述
第二个就是搜索函数,输入一个点去寻找它的根节点,通过一个循环函数,达到目的。
在这里插入图片描述
最后就是合并函数,将两点输入进来,通过搜索函数搜索,假如两点的根节点为同一个说明这两点在一个环内,假如两点根节点不同,说明不在一个环内,将y连接到x上。
在这里插入图片描述
测试一下,将含有一个环的图输入。
在这里插入图片描述
得到的结果也是相同的。
在这里插入图片描述
当然这个结构还可以进一步优化。
首先第一个是按秩合并:新设置一个rank数组纪录长度。按秩合并需要满足规则是短树接长数,相同父辈数加加,也就是说假如两点rank中的数有大小的话,将rank数小的树接到rank数大的下面。假如rank数相同的话,随便选择一个连接方向,父辈点的rank值加一。

在这里插入图片描述
第二个是加速查询。通过递归的方法去找根节点。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值