836. 合并集合(并查集合)

发布时间:2024年01月15日

836. 合并集合

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

现在要进行?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≤105

输入样例:
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
输出样例:
Yes
No
Yes
#include <bits/stdc++.h>
using namespace std;
int p[100010];
int find(int x) {//返回x的祖宗节点+路径压缩 
	if(p[x]!=x) {
		p[x]=find(p[x]);//如果x不是根节点,让父结点等于祖宗节点 
	}
	return p[x];
}
int main() {
	int n,m,a,b;
	char q;
	cin>>n>>m;
	for(int i=1;i<=n;i++) p[i]=i;//i是树根 
	
	for(int i=1;i<=m;i++) {
		cin>>q>>a>>b;
		if(q=='M') {
			p[find(a)]=find(b);//find(x)代表x的祖宗节点 
		}
		else {
		if(find(a)==find(b))
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
		}
		 
	}
	
	return 0;
} 

?

文章来源:https://blog.csdn.net/weixin_74232679/article/details/135560712
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。