티스토리 뷰

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

 

1717번: 집합의 표현

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

www.acmicpc.net

경로를 압축한 유니온 파인드 알고리즘을 이용해 풀이하였습니다.


C++ 소스 코드

#include <iostream>
#define MAX 1000001
using namespace std;
int parent[MAX];
int find(int x){
    if (x == parent[x]){
        return x;
    } else {
        int y = find(parent[x]);
        parent[x] = y;
        return y;
    }
}
void union_P(int a, int b){
    a = find(a);
    b = find(b);
    if (a < b){
        parent[b] = a;
    } else parent[a] = b;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    for(int i=0;i<=n;i++){
        parent[i] = i;
    }
    int u,a,b;
    for(int i=0;i<m;i++){
        cin >> u >> a >> b;
        if (u == 0){
            union_P(a,b);
        } else {
            a = find(a);
            b = find(b);
            if (a == b){
                cout << "YES" << '\n';
            } else cout << "NO" << '\n';
        }
    }
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함