并查集模板的应用:连通块

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

一、链接

837. 连通块中点的数量

二、题目

给定一个包含 nn 个点(编号为 1∼n1∼n)的无向图初始时图中没有边

现在要进行 mm 个操作,操作共有三种:

  1. C a b,在点 aa 和点 bb 之间连一条边,aa 和 bb 可能相等;
  2. Q1 a b,询问点 aa 和点 bb 是否在同一个连通块中,aa 和 bb 可能相等;
  3. Q2 a,询问点 aa 所在连通块中点的数量;
输入格式

第一行输入整数 nn 和 mm。

接下来 mm 行,每行包含一个操作指令,指令为 C a bQ1 a b 或 Q2 a 中的一种。

输出格式

对于每个询问指令 Q1 a b,如果 aa 和 bb 在同一个连通块中,则输出 Yes,否则输出 No

对于每个询问指令 Q2 a,输出一个整数表示点 aa 所在连通块中点的数量

每个结果占一行。

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:
5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5
输出样例:
Yes
2
3

三、题意

如果两个点之间是连接的,就表示这两个点构成了一个连通块,连通块是原图的子图,子图之外没有点和子图内部的点有联系,也就是说子图之外只要有一个点和子图有联系,就会形成一个新的子图

我们需要进行多次操作,C是合并两个元素,Q1是查询是否是同一个集合,Q2是查询有多少个元素属于这个集合

四、代码

#include<iostream>

using namespace std;

const int N=1e5+10;

int p[N],si[N];

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

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        si[i]=1;
    }
    
    while(m--)
    {
        char op[2];
        int a,b;
        
        scanf("%s",op);
        if(op[0]=='C')
        {
            scanf("%d%d",&a,&b);
            a=find(a),b=find(b);
            if(a==b)
            {
                continue;
            }
            p[a]=b;
            si[b]+=si[a];
        }
        else if(op[1]=='1')
        {
            scanf("%d%d",&a,&b);
            if(find(a)==find(b))
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",si[find(a)]);
        }
    }
    
    return 0;
}

五、总结

1.并查集的简单应用,做出这道题目最好不要在脑子里面模拟,初学或者不熟悉题型,最好还是在纸上详细模拟实现,寻找他应该使用什么算法,然后把算法模板应用上去,比如说这道题目就是处理两个元素,最开始两个元素是孤立的,后面把两个元素合并到一个集合(连通块),判断两个元素是不是连通块其实就是判断两个元素是不是属于同一个集合,连通块大小的话,直接把大小存在根节点,维护根节点的大小即可。

2.并查集的模板:并查集模板-两个操作:合并集合和查询两个元素是否属于同一个集合

3.什么是连通块:连通块概念 

4.continue的作用:continue

5.continue在这里的作用:a和b两个元素相等的话,就不把两个元素的根节点的size更新,因为更新的话就会变成原来的两倍,但是根据实际情况,在这里是不需要更新的,注意这里如果两个元素属于同一个连通块的话,也是需要直接跳出后续的合并步骤的(不仅仅是两个元素相等,操作完之后再出现操作过的数字,还是不再需要处理)

6.把a和b的根节点先取出来,a的根节点更新之后会和b的根节点重合,那时再去维护size将会发生错误,所以要么把根节点取出来,要么先更新size再更新根节点

7.熟练应用,熟能生巧

六、精美图片

并查集模板的应用:连通块,算法竞赛,算法,数据结构

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

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

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

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

相关文章

  • AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

    链表题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 AcWing. 826.单链表 双链表 AcWing 827.双链表 AcWing 828.模拟栈 AcWing 3302.表达式求值 AcWing 829. 模拟队列 AcWing 830.单调栈 AcWing 154.滑动窗口 AcWing 831. KMP字符串 AcWing 835. Trie字符串统计 AcWing 143. 最大异或对 AcWing 836.合并集合

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

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

    2024年02月04日
    浏览(78)
  • 【蓝桥模板】——如何用7行代码,优雅地拿捏并查集?(并查集模板)

    全文目录🧭 👩‍👩‍👦并查集-亲戚问题 🚀传送锚点​  💡思路点拨 🍞代码详解   👶🏻并查集-蓝桥幼儿园 🚀传送锚点  💡思路点拨 🍞代码详解   🌼并查集-合根植物 🚀传送锚点  💡思路点拨 🍞代码详解    🏰并查集-城邦 🚀传送锚点​​​​​​​  💡思

    2023年04月09日
    浏览(34)
  • 【模板】并查集

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

    2024年01月25日
    浏览(35)
  • 【数据结构】--并查集

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

    2023年04月09日
    浏览(33)
  • 【数据结构】并查集

    并查集是简单的数据结构,学会并查集,为图打好基础。 是树状的数据结构,用于处理相交集合的合并与查询 通常用森林表示,一片森林表示一个集合 并查集一般需要完成 查找元素属于哪个集合 查看两个元素是否属于同一个集合 将两个集合归并成一个集合 集合的个数 假

    2024年02月19日
    浏览(36)
  • 【高阶数据结构】——并查集

    在一些应用问题中, 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合, 然后按一定的规律将归于同一组元素的集合合并 。在此过程中要 反复用到查询某一个元素归属于那个集合的运算 。适合于描述这类问题的抽象数据类型称为 并查集

    2024年02月16日
    浏览(37)
  • 数据结构--并查集

    所有元素的全集s 将各个元素划分为若干个互不相交的子集 用一个数组S[ ]即可表示“集合”关系 集合的两个基本操作―— “并” color{red}“并” “ 并 ” 和 “查” color{red}“查” “ 查 ” Find -—“查”操作:确定一个指定元素所属集合 Union --“并”操作:将两个不想交的集

    2024年02月15日
    浏览(36)
  • 数据结构---并查集

    这里可以使用生活中的一个例子来带着大家理解并查集,大家在上学的过程中肯定会发现一种现象,在开学之前大家谁也不认识谁每个人都是一个小团体,可是开学之后因为座位旁边有一个同桌,所以开学没多久你和同桌就会互相认识并且开心的玩在一起,那么这时就是两个

    2024年02月15日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包