코딩테스트/백준
[백준][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) 알고리즘 특정 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