用处:
并查集是一种用来处理不同集合之间的关系的算法。正如它名字一样它本身就是一个可以合并,查询的树形集合。它可以用来做分组类型的题。具体功能,拓展和原理
实现:
基本功能的实现:
\(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\) 题解