洛谷
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int fa[N];
int n, m;
int find(int x) {
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
void unionset(int x, int y) {
fa[find(x)] = find(y);
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
fa[i] = i;
}
while(m--) {
int x, a, b;
cin >> x >> a >> b;
if(x == 1) {
unionset(a, b);
}
else{
a = find(a), b = find(b);
if(a == b) cout << "Y\n";
else cout << "N\n";
}
}
return 0;
}
查找x的父节点
int find(int x) {
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);//路径压缩
}
合并
void unionset(int x, int y) {
fa[find(x)] = find(y);
}