合并集合

题目描述

一共有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”。

每个结果占一行。

样例输入 Copy

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

样例输出 Copy

Yes
No
Yes

提示

数据范围

1 ≤ n,m ≤ 1e5

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N = 1e6 + 10;
int f[N];

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

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

  

posted @ 2022-04-14 22:00  ora12321  阅读(30)  评论(1)    收藏  举报