题目:P3367 【模板】并查集
题目背景
本题数据范围已经更新到 1 ≤ N ≤ 2 × 10 5 1\le N\le 2\times 10^5 1≤N≤2×105, 1 ≤ M ≤ 10 6 1\le M\le 10^6 1≤M≤106。
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N , M N,M N,M ,表示共有 N N N 个元素和 M M M 个操作。
接下来 M M M 行,每行包含三个整数 Z i , X i , Y i Z_i,X_i,Y_i Zi,Xi,Yi 。
当 Z i = 1 Z_i=1 Zi=1 时,将 X i X_i Xi 与 Y i Y_i Yi 所在的集合合并。
当
Z
i
=
2
Z_i=2
Zi=2 时,输出
X
i
X_i
Xi 与
Y
i
Y_i
Yi 是否在同一集合内,是的输出
Y
;否则输出 N
。
输出格式
对于每一个
Z
i
=
2
Z_i=2
Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y
或者 N
。
输入输出样例 #1
输入 #1
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出 #1
N
Y
N
Y
说明/提示
对于 15 % 15\% 15% 的数据, N ≤ 10 N \le 10 N≤10, M ≤ 20 M \le 20 M≤20。
对于 35 % 35\% 35% 的数据, N ≤ 100 N \le 100 N≤100, M ≤ 10 3 M \le 10^3 M≤103。
对于 50 % 50\% 50% 的数据, 1 ≤ N ≤ 10 4 1\le N \le 10^4 1≤N≤104, 1 ≤ M ≤ 2 × 10 5 1\le M \le 2\times 10^5 1≤M≤2×105。
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 2 × 10 5 1\le N\le 2\times 10^5 1≤N≤2×105, 1 ≤ M ≤ 10 6 1\le M\le 10^6 1≤M≤106, 1 ≤ X i , Y i ≤ N 1 \le X_i, Y_i \le N 1≤Xi,Yi≤N, Z i ∈ { 1 , 2 } Z_i \in \{ 1, 2 \} Zi∈{1,2}。
代码
#include<iostream>
using namespace std;
const int MaxN = 2e5 + 10;
int N, M;
int p[MaxN];
void init(){
for(int i = 1; i <= N; i ++){
p[i] = i;
}
}
int findd(int x){
if(p[x] == x){
return x;
}
p[x] = findd(p[x]);
return p[x];
}
void merge(int x, int y){
int px = findd(x), py = findd(y);
if(px != py){
p[px] = py;
}
}
bool query(int x, int y){
return findd(x) == findd(y);
}
int main(){
scanf("%d%d", &N, &M);
init();
while(M --){
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if(op == 1){
merge(x, y);
}
else{
if(query(x, y)){
puts("Y");
}
else{
puts("N");
}
}
}
return 0;
}