AcWing 836. 合并集合

该文章提供了一个使用并查集解决集合合并与查询问题的C++代码实现。程序通过路径压缩优化查找效率,处理Mab(合并集合)和Qab(查询集合关系)两种操作。在给定的数据范围内,正确判断两个元素是否属于同一集合。
摘要由CSDN通过智能技术生成

文章题目

一共有 n� 个数,编号是 1∼n1∼�,最开始每个数各自在一个集合中。

现在要进行 m� 个操作,操作共有两种:

  1. M a b,将编号为 a� 和 b� 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a� 和 b� 的两个数是否在同一个集合中;

输入格式

第一行输入整数 n� 和 m�。

接下来 m� 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 a� 和 b� 在同一集合内,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

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

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes

#include<iostream>
using namespace std;
const int N=1e6+10;
int n,m;
int p[N];

int find(int x)//返回祖宗结点+路径压缩
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) p[i]=i;

    while(m--)
    {

        char op[2];
        int a,b;
        scanf("%s%d%d",op,&a,&b);
        //用scanf 读入字符串的话可以规避后面空格和换行,做题血的教学
        if(op[0]=='M')p[find(a)]=find(b);
        //本来a的祖宗结点就到头了,没有祖宗节点的父节点
        //这样子是让b的祖宗结点  成为了a的祖宗节点的父节点
        else 
        {
            if(find(a)==find(b))cout<<"Yes"<<endl;
            else puts("No");
            //这个输出可以换成puts("Yes")可以自动换行
        }
    }
}

作者:云自成欢水自闲
链接:https://www.acwing.com/solution/content/185798/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值