코딩테스트/백준

[백준][C++]1717번 집합의 표현

윤깡패 2023. 6. 7. 20:31

문제

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

 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net

 

 

풀이

유니온 파인드(Union-Find) 알고리즘

 

유니온 파인드(Union-Find) 알고리즘

유니온 파인드(Union-Find) 알고리즘 특정 2개의 노드를 연결해 1개의 집합으로 묶는 union 연산 + 두 노드가 같은 집합에 속해 있는지를 확인하는 find 연산 유니온 파인드 핵심 이론 union 연산 각 노드

soobin0821.tistory.com

 

 

코드

#include <iostream>
#include <vector>
using namespace std;

int find_parent(int a);
void union_parent(int a, int b);
static vector<int> parent;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int n, m;
  cin >> n >> m;

  parent.resize(n + 1);
  for(int i = 0; i <= n; i++)
  {
    parent[i] = i;	// 대표 노드를 자기 자신으로 초기화하기
  }

  int check, a, b;
  for(int i = 0; i < m; i++)
  {
    cin >> check >> a >> b;
    if(check == 0)	
    {
      // 집합 합치기
      union_parent(a, b);
    }
    else if(check == 1)
    {
      // 두 원소가 같은 집합인지 확인
      if(find_parent(a) == find_parent(b))
      {
        cout << "YES" << "\n";
      }
      else
      {
        cout << "NO" << "\n";
      }
    }
  }

  return 0;
}

// find_parent 연산 : 대표 노드를 찾아서 반환
int find_parent(int a)
{
  if(a == parent[a])
  {
    return parent[a];
  }
  else
  {
    return parent[a] = find_parent(parent[a]);	// 재귀 함수 형태로 구현
  }
}

// union_parent 연산 : 바로 연결이 아닌 대표 노드끼리 연결함
void union_parent(int a, int b)
{
  // a와 b의 대표 노드 찾기
  a = find_parent(a);
  b = find_parent(b);

  // 두 원소의 대표 노드끼리 연결
  if(a < b)
  {
    parent[b] = a;
  }
  else if(a > b)
  {
    parent[a] = b;
  }
}

 

 

 

728x90