#include<bits/stdc++.h>
using namespace std;
long long gcd(int a, int b){
long long c;
while(b != 0){
c = a % b;
a = b;
b = c;
}
return a;
}
long long lcm(int a, int b){
return (a*b) / gcd(a, b);
}
long long solution(vector<int> arr) {
int answer = 1;
for(int i = 0 ; i < arr.size() ; i++){
answer = lcm(arr[i], answer);
}
return answer;
}
가령, a가 속한 집합이 3이고, 3이 속한 집합이 2라면 r[3]이 b가 속한 집합으로 수정되어야 하기 때문에,
r[getParent(a)] = getParent(b) 의 로직을 사용한다.
getParent의 경우, r[n]=n이 나올 때까지, 즉 최상단 부모노드일 때까지 getParent가 실행되어야 한다.
#include<iostream>
using namespace std;
int r[1000001];
int n, m;
int getParent(int num) { //find
if (r[num] == num)
return num;
else{
return r[num] = getParent(r[num]);
}
}
void join(int a, int b) { // union
//a의 부모를 b의 부모로 수정
r[getParent(a)] = getParent(b);
int main(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";
}
}
return 0;
}