并查集专题

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

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

 

 

 

 

 

你可能感兴趣的:(编程,算法)