둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (220) N
    • BOJ (173) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (2) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/유니온 파인드

1717번: 집합의 표현

2025. 8. 13. 23:21

1717번: 집합의 표현

사용 언어: C++

문제 요약

초기에 0, 1, 2, ..., n의 원소 각각이 자기 자신만 담은 n+1개의 서로 집합으 ㄹ이룬다. 두 연산을 m번 처리한다.

1. 합집합 연산 : o a b -> a 가 속한 집합과 b가 속한 집합을 합친다.

2. 동일 집합 질의: 1 a b -> a와 b가 ㅈ같은 집합에 속하면 YES, 아니면 No를 출력. 제한은 n <= 1,000,000, m <= 100,000이며, 0<= a,b <= n이다.

풀이

합집합을 하고 해당 두 수가 같은 집합에 있는지 찾는 최적의 방식은 유니온 파인드다.

유니온 파인드의 핵심 연산은 두 가지다.

1. find(x)

- 원소 x가 속한 집합의 대표(root)를 찾는다

int find_parent(vector<int>& parent, int x)
{
    if(parent[x] == x) return x;
    
    return parent[x] = find_parent(parent, parent[x]);
}

 

2. union(a, b)

- a, b의 두 대표를 찾아 서로 다르면 한 쪽을 다른 쪽의 부모로 붙인다.

void union_sets(vector<int>& parent, int x, int y)
{
    int rootX = find_parent(parent, x);
    int rootY = find_parent(parent, y);
    
    if(rootX != rootY) parent[rootY] = rootX;
}

 

답

#include <iostream>
#include <vector>

using namespace std;

int find_parent(vector<int>& parent, int x)
{
    if(parent[x] == x) return x;
    
    return parent[x] = find_parent(parent, parent[x]);
}

void union_sets(vector<int>& parent, int x, int y)
{
    int rootX = find_parent(parent, x);
    int rootY = find_parent(parent, y);
    
    if(rootX != rootY)
    {
        parent[rootY] = rootX;
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n, m;
    cin >> n >> m;
    
    vector<int> parent(n+1);
    for(int i=0; i<=n; i++)
    {
        parent[i] = i;
    }
    
    for(int i=0; i<m; i++)
    {
        int op, a, b;
        cin >> op >> a >> b;
        
        if(op == 0)
        {
            union_sets(parent, a, b);
        }
        else
        {
            if(find_parent(parent, a) == find_parent(parent, b))
            {
                cout << "YES\n";
            }
            else
            {
                cout << "NO\n";
            }
        }
    }

    return 0;
}
저작자표시 (새창열림)

'BOJ > 유니온 파인드' 카테고리의 다른 글

11401번: 이항 계수 3  (2) 2025.08.14
    'BOJ/유니온 파인드' 카테고리의 다른 글
    • 11401번: 이항 계수 3
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바