가령, a가 속한 집합이 3이고, 3이 속한 집합이 2라면 r[3]이 b가 속한 집합으로 수정되어야 하기 때문에,
r[getParent(a)] = getParent(b) 의 로직을 사용한다.
getParent의 경우, r[n]=n이 나올 때까지, 즉 최상단 부모노드일 때까지 getParent가 실행되어야 한다.
#include<iostream>usingnamespace std;
int r[1000001];
int n, m;
intgetParent(int num){ //findif (r[num] == num)
return num;
else{
return r[num] = getParent(r[num]);
}
}
voidjoin(int a, int b){ // union//a의 부모를 b의 부모로 수정
r[getParent(a)] = getParent(b);
intmain(void){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i <= n; i++) {
r[i] = i;
}
while (m--) {
int cmd, a, b;
cin >> cmd >> a >> b;
if (cmd == 0) {
join(a, b);
}
else {
if (getParent(a) == getParent(b))
cout << "YES\n";
else
cout << "NO\n";
}
}
return0;
}