티스토리 뷰

백준

백준 소스코드 [C++] 1717 집합의 표현

Hani_Levenshtein 2021. 7. 12. 22:27

https://www.acmicpc.net/problem/1717

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

백준 소스코드 [C++] 1717 집합의 표현

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <deque>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string.h>
#include <set>
#include <map>
#include <unordered_map>
#include <sstream>
#include <cstdlib>
#include <cassert>
#define all(v) v.begin(), v.end()
#define pii pair<int, int>
#define pli pair<ll, int>
#define make_unique(v) sort(all(v)), v.erase(unique(all(v)), v.end())
typedef long long ll;
using namespace std;

int parent[1000001];
 
int findRoot(int x){
    if(x == parent[x]) return x;
    return parent[x] = findRoot(parent[x]);
}
 
void merge(int L, int R){
    L = findRoot(L);
    R = findRoot(R);
    if(L != R) parent[L] = R;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n, m, order, a, b;
    cin >> n >> m;
       
    for(int i = 0; i <= n; i++) parent[i] = i;
   
    for(int i = 0; i < m; i++){
       cin >> order >> a >> b;
       if(order == 0) merge(a, b);
       else {
           if(findRoot(a) == findRoot(b)) cout << "yes" << '\n';
           else cout << "no" << '\n';
       }
   }

    return 0;
}
댓글