蓝桥杯--高级数据结构之并查集(算法笔记11)

并查集的几个基本操作图解:

已知上面几个并查级,再来看题

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1050;

int s[maxn];//集

void init_set(){//初始化函数,每一个集位置的大小与元素的大小相同

    for(int i=1;i<=maxn;i++)

        s[i] = i;

}

int find_set(int x){//查找x归属的关系集

    return x==s[x]? x:find_set(s[x]);//如果x的归属集是本身,则返回x。也就是说当前变量x没有和任何变量产生关系

    //否则继续查找当前x归属的集A的母集B

}

void union_set(int x,int y)//合并关系集

{

    x = find_set(x);//首先找到x与y对应的最终母集

    y = find_set(y);

    if(x!=y)s[x]=s[y];//如果两个不是同一个母集,那么就将y的母集给到x的母集(也就是x和y建立关系s[y])

}

int main()

{

    int t,n,m,x,y;

    cin>>t;

    while(t--)

    {

        cin>>n>>m;

        init_set();

        for(int i=1;i<=m;i++)

        {

            cin>>x>>y;

            union_set(x,y);//根据输入的关系,建立关系

        }

        int ans=0;

        for(int i=1;i<=n;i++)

        {

            if(s[i]==i)//如果元素和最终归属集相同,则桌子数加1。

                ans++;

        }

        cout<<ans<<endl;

        //桌子的数量取决于大家是否认识,也就是说桌子坐的人要么是一个人,要么是归属于同一个母集的所有人

    }

    return 0;

}

关于算法优化:

合并优化不是特别明白,粘贴于此待复习时看

路径压缩就像是记忆性递归,减少递归深度。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值