【模板】并查集

这篇具有很好参考价值的文章主要介绍了【模板】并查集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  并查集是解决两元素是否属于同一集合,将一个集合合并另一集合的数据结构。具体来说,我们使用数字代替集合,比如集合1,集合2.使用数组f[i]维护元素i属于的集合,比如f[2] = 4表示元素2属于集合4。具体我们有以下实现功能的代码

1 初始化表示集合的数组。

    cin>>n>>m;
    for(int i=1; i<=n; i++)
        f[i]=i;

 

   表示元素i属于集合i,也就是说开始每个元素都是散开的。

2 实现查找功能的find()函数

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

具体说明以下怎么实现的查找到的根结点(图有点丑)

【模板】并查集

 

 以结点d为例,假设我们查找结点d属于那个集合也就是查找到这颗树的根结点。

从系统栈层面解释。【模板】并查集

 

【模板】并查集

 可以看到到达结点a之后,返回栈开始返回。

【模板】并查集

 结点a从上到下赋值给路径上的所有结点。那么这棵树就变成这样。

【模板】并查集

 这就是路径压缩。

3 合并函数join()

void join (int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)     f[fx]=fy;
};

 

  假设合并元素x,y所在集合首先find(x),find(y)找到元素x,元素y属于那个集合。

【模板】并查集

 然后将f[fx] 赋值为 fy,也就是x所在集合加入y所在集合。

【模板】并查集

 实现了合并。

 4 维护特征的并查集(带权并查集)

  例题:837. 连通块中点的数量 https://www.acwing.com/problem/content/839/

  只需要多增加一个数组siz[]来储存集合i的大小即可。初始化siz[i] = 1;

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5 + 10;
int n,m;

int f[maxn],size_f[maxn];

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

void join(int x,int y){
    int x1 = find(x),y1 = find(y);
    if(x1 != y1) {
        size_f[y1] += size_f[x1]; // 主要维护集合fy的大小。
        f[x1] = y1;
    }
}
signed main ()
{
    cin>>n>>m;
    
    for(int i = 1; i<= n; i++){
        f[i] = i;
        size_f[i] = 1;
    }
    while(m--){
        string op;
        cin>>op;
        if(op == "C"){
            int a,b;
            cin>>a>>b;
            join(a,b);
        }else if(op == "Q1"){
            int a,b;
            cin>>a>>b;
            printf(find(a) == find(b) ? "Yes\n":"No\n");
        }else if(op == "Q2"){
            int a;
            cin>>a;
            printf("%d\n",size_f[find(a)]);
        }
    }
    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-824046.html

 

到了这里,关于【模板】并查集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【华为OD机试】1035 - 判断两个IP是否属于同一子网

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

    2024年02月02日
    浏览(58)
  • (IP地址的计算)判断两个IP是否归属于同一子网

    目录 前言 判断依据(附示例) 问题          今天在做题的时候做到了IP地址计算这一部分的题目,太久没有看过了,忘得都差不多了,所以就查阅了资料并做了如下笔记,帮助学习理解,同时把这道题的题目与网友分享的做法分享给大家,可以一起做一做,希望能帮助

    2024年02月08日
    浏览(55)
  • 【算法每日一练]-图论(保姆级教程篇7 最小生成树 ,并查集模板篇)#村村通 #最小生成树

    目录 题目:村村通 并查集  题目:最小生成树 kruskal算法 prim算法          先引入问题: 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的 任意两个之间都可以通信 ,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要 使铺设光

    2024年02月04日
    浏览(78)
  • 【华为机试真题详解JAVA实现】—判断两个IP是否属于同一子网

        目录 一、题目描述 二、解题代码 IP地址是由4个0-255之间的整数构成的,用\\\".\\\"符号相连。 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 子网

    2023年04月09日
    浏览(75)
  • 并查集(种类并查集,带权并查集)

    链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网   动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所

    2024年02月11日
    浏览(40)
  • 并查集

    并查集 并查集是用来判断两个元素是否属于同一个集合 即判断他们的根节点是否相同 1. 初始化 2.查询根节点 3.合并 集合变为一个长长的链时,查找变得十分麻烦,此时我们需要路径压缩 即每个人的直接根节点就是最上面的根节点 我们判断两个元素是否是同一个集合,看的

    2024年02月08日
    浏览(31)
  • C++:合并集合(并查集)

    一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有2种: 1.“M a b”,将编号为a和b的两个数的所在的集合合并,如果两个数已经在同一个集合中则忽略这个操作 2.“Q a b”,询问编号为a和b的两个数是否在同一个集合中 第一行输入整数

    2024年02月13日
    浏览(41)
  • 并查集:推导部分和

    推导部分和 问题描述 对于一个长度为 N N N 的整数数列 A 1 , A 2 , ⋯ A N A_{1}, A_{2}, cdots A_{N} A 1 ​ , A 2 ​ , ⋯ A N ​ , 小蓝想知道下标 l l l 到 r r r 的部 分和 ∑ i = l r = A l + A l + 1 + ⋯ + A r sum_{i=l}^{r}=A_{l}+A_{l+1}+cdots+A_{r} ∑ i = l r ​ = A l ​ + A l + 1 ​ + ⋯ + A r ​ 是多少? 然而

    2024年02月11日
    浏览(32)
  • 相似图片分类 [华为]【并查集】

    题目描述: 小明想要处理一批图片,将相似的图片分类,他首先对图片的特征采样,得到图片之间的相似度,然后 按照以下规则判断图片是否可以归为一类: 1)相似度0表示两张图片相似; 2)如果A和B相似,B和C相似,但A和C不相似,那么认为A和C间接相似,可以把ABC归为一

    2024年04月12日
    浏览(39)
  • 【数据结构】--并查集

    目录 一、概念 ​编辑 二、应用场景--“连接”问题(属于同一Qu 三、实现思路  四、如何存储数据 五、定义接口 1.初始化(init) 2.其他 isSame() 六、抽象类 六、Quick Find【v1 所在集合的所有元素都指向 v2 的根节点】 1.Union 1.Union图解 2.注意点:  3.代码实现 2.find  1.find图

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包