并查集
题目链接:ybt高效进阶3-1-1 / luogu P3367
题目大意
有 n 个元素,你需要完成集合的合并和判断两个元素是否在同一集合中这两种操作。
思路
这个就是简单的并查集模板啦。
代码
#include<cstdio>
using namespace std;
int n, m, fa[10001], op, x, y;
int find(int now) {
if (fa[now] == now) return now;
return fa[now] = find(fa[now]);//记忆住它的最父亲的位置以减少使用的时间
}
void connect(int x, int y) {
int X = find(x), Y = find(y);
fa[X] = Y;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &op, &x, &y);
if (op == 1) connect(x, y);
else {
if (find(x) == find(y)) printf("Y\n");
else printf("N\n");
}
}
return 0;
}