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];
}
}

本文介绍了并查集这一数据结构的基本概念、实现方法及其应用。详细讲述了初始化、查找、合并等核心操作,并通过一个社交网络中朋友关系的问题实例来说明如何使用并查集解决实际问题。
382

被折叠的 条评论
为什么被折叠?



