并查集模板

题目描述

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

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

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

【输入格式】

第一行输入整数 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
 1 #include <iostream>
 2 using namespace std;
 3 const int N = 100009;
 4 int fa[N];
 5 
 6 int find(int x)
 7 {
 8     if(fa[x] != x)
 9         fa[x] = find(fa[x]);
10     return fa[x];
11 }
12 int n,m;
13 int main()
14 {
15     cin >> n >> m;
16     for(int i = 1;i <= n;++i)
17         fa[i] = i;
18     while(m--)
19     {
20         char op;
21         int a,b;
22         cin >> op >> a >> b;
23         if(op == 'M')
24         {
25             fa[find(a)] = find(b);
26         }
27         else
28         {
29             if(find(a) == find(b))
30                 cout << "Yes" << endl;
31             else
32                 cout << "No" << endl;
33         } 
34     }
35     return 0;
36 }

 

posted @ 2021-10-19 22:31  Modest-Hamilton  阅读(30)  评论(0)    收藏  举报