BOJ 1717. 집합의 표현
1. 문제설명
- {0}, {1}, {2}, ..., {n}이 있다.
- 합집합 연산과 두 원소가 같은 집합에 포함되는지 확인하는 연산을 수행하려고 한다.
- 
    연산에 대한 결과를 출력하라 
- 문제 분류
    - Disjoint set
 
2. 알고리즘 설계
- Union-Find 문제이다.
    - 
        사실 알고리즘 단톡방에서 문제 추천 받음. 
 
- 
        
- 로직
    - 합집합 연산은 부모를 통일시켜주면 되고,
- 확인하는 연산은 Find를 통해 부모가 같은지 확인해주면 된다.
 
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
const int SZ = 1'000'002;
int n, m, opt, a, b, P[SZ];
int Find(int u) {
    if(P[u] == u) return u;
    return P[u] = Find(P[u]);
}
void Union(int u, int v) {
    u = Find(u);
    v = Find(v);
    P[u] = v;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for(int i=0; i<=n; i++) P[i] = i;
    while(m--) {
        cin >> opt >> a >> b;
        if(opt == 0) Union(a, b);
        else cout << (Find(a) == Find(b) ? "YES\n": "NO\n");
    }    
    return 0;
}