并查集浅析

题目详情 - L2-024 部落 (pintia.cn)

 这里本人不对代码作解释,而是只对并查集作自我总结,这里本人随便写了一个测试用例,便于理解

算法学习笔记(1) : 并查集 - 知乎 (zhihu.com)

我们输入两个数你n,m,然后输入m对数x,y,表示该两个数产生联系,求有几个独立的,也就是把产生联系的看作一个整体,而统计两两不产生联系的整体有几个。

下面是测试用例:

如下图应该输出的结果为3,表示3个整体互不相关,有联系的我们已经把他们挂在同一个根节点上,以根节点代表这一个整体,

这里上图比较简单,按理来说,是把 x当作y的父节点或者应当作x的父节点,最后挂到同一个根节点上,我们,通过函数体,去寻找他的根节点,以根节点的值作为一个整体的区别,根节点下的所有节点都等于根节点的值,因为我们令数组,a[i]=i,最后只要统计有几个a[i]=i就可以。

关键内容就是函数体和输入之后,利用函数将他们连接

#include<bits/stdc++.h>
using namespace std;
int a[10005];
int find(int x){
    if(a[x]!=x)a[x]=find(a[x]);
    return a[x];
}
int main(){
    int n,m,i,b=0,x,y;
   cin>>n>>m;
    for(i=1;i<=n;i++)a[i]=i;
    while(m--){
        cin>>x>>y;
        a[find(x)]=find(y);
    }
     for(i=1;i<=n;i++){
         if(a[i]==i)b++;
     }
    cout<<b;
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星河欲转。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值