简单并查集算法模板

文章介绍了并查集的基本思想,包括初始化、合并与查找操作。在传统做法基础上进行了优化,通过判断树的大小进行合并以降低时间复杂度至O(log2n)。提供了未优化的Y总模板做法,并给出C++代码示例,用于处理集合合并与查询是否属于同一集合的问题。
摘要由CSDN通过智能技术生成

并查集

简单并查集
基本思想:
采用双亲表示法,顺序存储。
课本做法:
①初始化数组的值为-1
②若是合并就让一个树的根的数组值指向另一个根的下标
③(查根节点)若是查询就一直到数组值小于0的时候终止
时间复杂度为O(n)

优化:查的过程,并且观察到时间复杂度和树的高度有关即:
①小树合并到大树
②判断小树和大树,将数组根节点的值的绝对值作为大小判断。
时间复杂度为O(log2n)

Y总模板做法(未优化):
①全部初始化为自己的下标值
②若是合并也是将一个集合的根节点的数组值指向另一个集合的根节点的下标
③(查根节点)若是查就查他数组中的值是不是自己的下标即可(下标从1开始) 
#include<iostream>
#include<algorithm>

using namespace std;
const int N = 1e5 +10;
int st[N];
int n,m;

int find(int x)
{
    if(st[x]!=x)
    st[x]=find(st[x]);
    else
    return st[x];
}

int main()
{
    cin >> n >> m;
    for(int i=1;i<=n;i++)
        st[i]=i;
        
    while(m--)
    {
        char op;
        cin >> op;
        int a,b;
        cin >> a >> b;
        if(op=='M')
        {   
            //采用的是树的双亲表示法存储的
            //数组中存储的是双亲的下标
            st[find(a)]=find(b);
        }
        else if(op=='Q')
        {
            if(find(a)==find(b))
            cout << "Yes" << endl;
            else
            cout << "No" << endl;
        }
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值