概念
并查集: 一种可以动态维护若干个不重叠的集合,并支持合并与查询的树型数据结构。
定义集合:(代表元法)每个集合选择一个固定的元素,作为整个集合的代表
定义归属关系:
- 普通算法:
用数组f[x]保存元素x所在的集合代表
例:两个集合(1,2,3) , (4,5) 则可将f[1],f[2],f[3]均赋值为3,将f[4],f[5]均赋值为5
可以快速查询元素的归属集合,但合并时的时间复杂度为O(n) - 并查集算法:
用树型结构存储每个集合,树上的每个节点是一个元素,树根是集合的代表元素。用数组fa保存父节点(根的父节点设为自己),即fa[x]保存x的父节点。合并集合时只需连接两个树根;但查询元素的归属时需从该元素开始,通过fa储存的值不断递归访问父节点直至到达树根
两种基本操作
并查集的初始化
int fa[SIZE];
for(int i=1;i<=n;i++){
fa[i]=i;
}
Get(查询一个元素属于哪个集合)
若x是树根,则x是集合代表,否则递归访问父节点fa[x]直至根节点
int get(int x){
if(x==fa[x]){
return x;
}