合并集合(c++题解)

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

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

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

第一行输入整数 n 和 m。

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

输出格式

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

每个结果占一行。

数据范围

1≤n,m≤105

输入样例:
复制代码
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
输出样例:
复制代码
Yes
No
Yes

写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int p[1000005];
int find(int x){//返回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);
		if(*op=='M')p[find(a)]=find(b);
		else{
			if(find(a)==find(b))puts("Yes");
			else puts("No");
		}
	}
	return 0;
}
相关推荐
byzh_rc3 分钟前
[认知计算] 专栏总结
线性代数·算法·matlab·信号处理
汉克老师4 分钟前
GESP2025年12月认证C++八级真题与解析(判断题8-10)
c++·快速排序··lcs·gesp八级·gesp8级
qq_4335545419 分钟前
C++ manacher(求解回文串问题)
开发语言·c++·算法
歌_顿29 分钟前
知识蒸馏学习总结
人工智能·算法
闲看云起1 小时前
LeetCode-day6:接雨水
算法·leetcode·职场和发展
没学上了1 小时前
VLM_一维离散卷积与二维离散卷积(还是复习感觉还行)
算法
HL_风神1 小时前
设计原则之迪米特
c++·学习·设计模式
黛色正浓1 小时前
leetCode-热题100-贪心合集(JavaScript)
javascript·算法·leetcode
HL_风神1 小时前
设计原则之合成复用
c++·学习·设计模式
轻微的风格艾丝凡2 小时前
嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践
数据库·算法·dsp开发·嵌入式软件