CSP-Week6 ProblemB 并查集详解和例题(POJ - 1611)

本文详细介绍了并查集这一数据结构,包括其在图论中的重要性、操作原理以及如何用C++实现。通过一道实际问题——新冠病毒传播预防,阐述了并查集在解决联通模块问题上的应用,展示了如何利用并查集找到与感染者的接触者,以隔离防止疫情扩散。
摘要由CSDN通过智能技术生成

CSP-普适结构–并查集

知识简述

并查集是一种图论中十分常见的数据结构,在联通模块和生成树问题中具有十分重要的作用,因此并查集是在程序设计中必须掌握的知识模块。
正如其名,并查集结构主要关注两个方面:
1、并操作
2、查操作
在这里插入图片描述要组织这种结构,可以使用各种各样的数据结构:数组、链表或者是树都可以做到。但是考虑到在比赛时的实现简易度,使用数组比较方便易行。
在对节点组进行并和查操作时,找出他得所有同组节点是不容易的,且可能会耗费掉巨大的时间复杂度,因此我们换一种思路:将一个元素作为每个组别的代表,在进行并查时只需要使用代表元素进行操作即可。为了减少空间开销,我们可以将整个并查集组织成下图的结构:
在这里插入图片描述每个组别使用祖先父亲节点作为这个点的代表元素,使用一个par[]数组来指示每个点的祖先即可。
考虑3种组织操作操作:
初始化:
在没有进行并之前,每个节点是独立的,其同组节点只有自己,因此可以直接将每个点的祖先置为自己,初始化状态:
在这里插入图片描述
查操作:
在查询一个节点的所属组别是,只需要查询出其祖先父亲节点就可以完成对组别的标识,进而进行后续操作,查操作的示例图:
在这里插入图片描述并操作:在进行并操作时,关键的是如何组织两个结构类型的根节点,这决定了整个并查集的性能(如果并查集的高度过大,同层的元素较少会导致性能退化)
因此我们使用点数优先的路径压缩法:(想了解各种路径压缩优化方法的同学可以百度)
在试行并操作时遵从两个操作原则:
1、将节点数较少的集合并入到节点数较少的集合中。
2、并入时直接将“小集合”祖先节点连接到“大集合”祖先节点的孩子节点即可。
操作图例如下:
在这里插入图片描述具体实现源码(c++):

const int max_floor=3e4;
int parent[max_floor];
int number[max_floor];
int find(int pos)
{
   
    if(parent[pos]==pos)
    return pos;
    else 
    return find(parent[pos])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值