并查集
并查集
并查集基础知识
定义
并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素.
思想
两个集合各出一个元素,以这个元素代表这个集合,以实现各种操作。
常用操作
1.查询两个元素是否在同一个集合中。
核心在查找代表元素
代码
` int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
`
2.合并两个集合。
将其中size较大的集合的代表元素换成这n个集合共同的代表元素
代码
x=find(x),y=find(y); if(x==y) continue; if(siz[x]>siz[y]) swap(x,y); if(siz[x]==siz[y] ) siz[y]+1; fa[x]=y;
例题
https://www.luogu.com.cn/problem/P3367并查集模板
https://www.luogu.com.cn/problem/P1551亲戚
洛谷P2814 家谱 (字符串+并查集)
洛谷P3958 奶酪 (并查集或搜索)
洛谷P2661 信息传递 (并查集)
[洛谷P3144 USACO16OPEN]Closing the Farm S
[洛谷P6121 USACO16OPEN]Closing the Farm G (上一道题的数据加强版,思路挺巧的,好题qvq)
洛谷P1955 程序自动分析 (离散化+种类并查集,没有离散化数据无情giao崩程序QAQ,算普通并查集中的较难题)
种类并查集
定义
即在普通并查集“亲戚的亲戚也是亲戚”的基础上再进行一些“分类”,但是这个分类呢并不是根据物品的种类来进行分类,而是类似“敌人的敌人是朋友”的分类(并没有说明“朋友的敌人是我的敌人”!要根据具体题目分析)
例题
洛谷P1892 团伙](https://www.luogu.com.cn/problem/P1892) (基础种类并查集 ,用普通并查集也能做)
洛谷P2024 食物链 (上文说到的三种循环关系的例题,值得做)
洛谷P1525 关押罪犯 (转换一下题目就是种类并查集,思路比较巧)
食物链
https://www.luogu.com.cn/problem/P2024
带权并查集
定义
- 知识搬运
并查集实际上是由若干棵树构成的森林,我们可以在树中的每条边上记录一个权值,即维护一个数组d,用d[i]保存节点i到父节点fa[i]之间的边权
在每次路径压缩后,每个访问过的节点都会直接指向树根,如果我们同时更新这些节点的d值,就可以利用路径压缩过程来统计每个节点到树根之间的路径信息
题型一般就是给出点之间的合并,然后询问两个点之间的距离
例题
-
[洛谷P1196 NOI2002]银河英雄传说
-
[洛谷P2342 USACO04OPEN]Cube Stacking G
-
银河英雄传说

浙公网安备 33010602011771号