1、并查集介绍:
在一些有N个元素的集合问题中,我们通常是在开始让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
主要用于:
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。
2、初始化
初始化很简单,将每个点所在集合初始化为它自己。如有n个点,就将数组fa[i]=i
void init(){
for(int i=1;i<=n;i++){
fa[i] = i;
}
}
3、查找
这一步,我们只需要找到根节点,即元素所在的集合。就是当fa[x]等于x时,就找到了根节点,return x。反之,继续查找。
int find(int x){
if(fa[x] == x)
return x;
return fa[x] = find(fa[x]);
}
4、合并
将两个不同元素所在的集合合并为一个集合。
void union(int x, int y){
fa[find(x)] = find(y);
}
5、例题
在网络社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 A 和 B 是朋友,B 和 C 是朋友,那么 A 和 C 也会成为朋友。即,我们规定朋友的朋友也是朋友。
现在要求你每当有一对新的朋友认识的时候,你需要计算两人的朋友圈合并以后的大小。
const int maxn=10010;
int n=0,k=0;
int[] sz = new int[maxn], fa = new int[maxn];
Map<String Integer>mp = new HashMap<>();
void init(){
for(int i=1;i<=n+1;i++){
fa[i] = i;
sz[i] = 1;
}
}
int find(int x){
if(fa[x] == x)
return x;
return fa[x] = find(fa[x]);
}
void merge(int x, int y){
int tempX = find(x), tempY = find(y);
if(tempX != tempY){
fa[tempX] = tempY;
sz[tempY] += sz[tempX];
}
}