唉文章开头第一句:回家旅游一时爽,集训补课火葬场。
Day3-并查集进阶
并查集
是什么:是一种树形集合式的数据结构
为什么:便于快速判断元素所在集合。看到了一种更好的说法:
并查集擅长的是动态维护图中具有传递性的关系。
怎么弄:要求能够在纸上推演:
- 建树过程
- 长链扁平化过程->路径压缩的建树过程
- 启发式合并思想->按秩合并的建树过程
启发式合并是一种思想:将小的并到大的而不是将大的并到小的,这是基于人类经验和直觉的算法
但学长说:
so…该了解还是要了解一下的,重点还在于利用并查集高效的解题 - get操作(查询一个节点所属的集合)
- 并查集组成结构:
一个记录父节点的数组fa[N],初始化为自己
一个get()找根节点的函数
一个merge(x,y)将x和y两个有关系的节点合并在一个集合
学长提及的两种进阶并查集:
扩展域并查集:
是什么:在并查集的基础上扩展出节点加以实现题目所需的复杂功能
为什么:实现复杂功能
怎么弄:例如扩展根节点以区分集合之间的关系(见例题)
例:https://blog.csdn.net/qq_39759315/article/details/80859210#commentsedit
题中三个集合是有A吃B,B吃C,C吃A的关系的,此时扩展域并查集是指在三个集合的根部扩展一个节点来表示三个物种,这里有一个非常出色的操作是用模3的结果来区分三个物种:
边带权并查集
是什么:在并查集的基础上多开一个数组记录相关数据(如例题中记录集合节点数的sze数组和记录转移次数的tran数组)
为什么:体现集合内部即节点与节点之间的关系
怎么弄:例如多开几个数组做记录(这么low吗我不敢相信自己的理解d=====( ̄▽ ̄*)b)
例:https://blog.csdn.net/weixin_42557561/article/details/83788210
说实话学算法写题目一点都不累还很爽,真希望ACM能继续打下去。这么着吧,明年招新我继续去,大不了别人打大二大三,我只打大三一年呗,再说,很多比赛也不止集训队员可以参加的,我大一虽然水过去了但比下一届大一有了很多经验,只要实力够了,一定会被需要的。