并查集专题

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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值