题目地址:
https://www.luogu.com.cn/problem/P3367
题目描述:
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式:
第一行包含两个整数
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
。
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e4 + 10, M = 2e5 + 10;
int n, m;
int p[N];
int find(int x) {
if (x != p[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--) {
int a, b, op;
cin >> op >> a >> b;
int pa = find(a), pb = find(b);
if (op == 1) p[pa] = pb;
else if (op == 2) printf("%s\n", pa == pb ? "Y" : "N");
}
return 0;
}
每次操作时间复杂度 O ( log ∗ n ) O(\log ^*n) O(log∗n),空间 O ( n ) O(n) O(n)。