728x90
https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
union-find 알고리즘의 기초 문제입니다.
#include <iostream>
//
#include <array>
#include <vector>
//
#include <algorithm>
using namespace std;
// 각 노드의 루트를 저장
vector<int> root_vec;
// find
int find_func(int node) {
// 자신의 루트가 자신이 아니면
if (root_vec[node] != node){
// 노드의 조상을 조상의 조상으로 변경하며 계속 탐색
root_vec[node] = find_func(root_vec[node]);
}
return root_vec[node];
}
// union
void union_func(int node_1, int node_2) {
// 각 노드의 조상
int root_1 = find_func(node_1);
int root_2 = find_func(node_2);
// 두 노드의 조상이 다르면 하나의 조상으로 병합
if (root_1 != root_2) {
root_vec[root_1] = root_2;
}
return;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
for (int i = 0; i < n+1; i++)
{
root_vec.push_back(i);
}
for (int i = 0; i < m; i++) {
int q, a, b;
cin >> q >> a >> b;
if (q == 0)
{
union_func(a, b);
}
else {
if (find_func(a) == find_func(b)) cout << "YES" << "\n";
else cout << "NO" << "\n";
}
}
}
728x90
'Coding Test > BaekJoon_C++' 카테고리의 다른 글
백준 11758 <CCW> C++ (0) | 2024.03.26 |
---|---|
백준 2252 <줄 세우기> C++ (0) | 2024.03.25 |
백준 11657 <타임머신> C++ (0) | 2024.03.14 |
백준 9935 <문자열 폭발> C++ (0) | 2024.03.13 |
백준 2592 <대표값> C++ (0) | 2024.03.06 |