并查集(学习笔记)
用处:
并查集是一种用来处理不同集合之间的关系的算法。正如它名字一样它本身就是一个可以合并,查询的树形集合。它可以用来做分组类型的题。具体功能,拓展和原理
实现:
基本功能的实现:
\(1.\)初始化,我们令每一个参加计算的点的父亲设为他自己:即初始时就有\(n\)个集合,每个点就算一个;
void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}
\(2.\)查询\(find()\)用来查找每一颗集合树的根。这样可以用来判断是否在同一集合,和进行合并操作;我们只需要用递归依次向上找父节点,直到找到一个点的父节点就是它自己即可。为了优化效率,及防止它形成一个链,使每次的查询都很慢。我们可以在递归时让每一个节点指向根节点;
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
\(3.\)合并\(merge\)。用来合并两个集合,只需要将一颗树根节点的父节点指向另一颗树的根节点即可。注意要先判断两个集合是否在同一集合
void merge(int x,int y){
if(find(x)==find(y))return;
fa[find(x)]=find(y);
}
练习:
\(1\).P1111 修复公路 题解
\(2\).P1525 [NOIP2010 提高组] 关押罪犯 题解
\(3.Cheap Robot\) 题解
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18682345
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步