并查集--算法,优化,变种

一、定义
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。
基础的并查集能实现以下三个操作:1.建立集合;2.查找某个元素是否在一给定集合内(或查找一个元素所在的集合); 3.合并两个集合.“并”“查”“集”三字由此而来。
并查集能解决的问题一般可以转化为这样的形式:初始时n个元素分属不同的n个集合,通过不断的给出元素间的联系,要求实时的统计元素间的关系(即是否存在直接或间接的联系)。
并查集本身不具有结构,可以用数组、链表以及树等实现。最常用的是数组实现。

二、实现
数组实现:
建立标记数组father,用father[i]表示元素i所属集合的标记。


图示

1.建立集合
开始时每个元素各自独立,可以把每个元素所属集合标记为其自身序号。

void make()
{
	int i;
	for(i=1;i<=n;i++)
    		father[i]=i;
}

2.合并集合&查找元素所属集合
find函数返回的是元素所属集合的根结点(别忘了并查集是树型的数据结构)。方法就是循环或递归,寻找当前结点的父结点,父结点的父结点,父结点的父结点的父结点......直到找到一个结点的父结点是它自己,那么它就是根结点。

int find(int
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值