Link https://www.acmicpc.net/problem/1717
소스결과 5896 KB / 40 ms
출처 Baekjoon
언어 C++ 17
분류 Disjoint-set
설명
0 ~ n 까지 총 n + 1개로 구성된 집합이 합 연산과 두 원소가 같은 집합에 속해 있는지 구하는 연산을 진행 할 때 같은 집합에 속하는지 확인 하는 연산에 대해서 결과 값을 출력해주어야 한다.
Dis-Joint Set에 대한 기초적인 문제, 추가로 위 문제에서는 높이를 최대 2로 낮추는 작업을 해주어야 시간제한에 걸리지 않는다.
합집합을 구하는 연산을 진행 할 때 부모를 찾는 작업을 진행 해야 하는데 그 과정에서 높이를 압축시키는 과정이 진행 된다.
스터디를 진행 하면서 푸는 문제이기에 DIs-Joint Set을 클래스화 시켜 문제를 해결했다.
소스코드
#include <iostream>
#include <vector>
using namespace std;
class DisJointSet
{
int size;
vector<int> parent;
public:
DisJointSet(int size) : size(size) {
parent.resize(size);
for (int i = 0; i < size; i++) parent[i] = i;
};
int find(int v) {
if (parent[v] == v) return v;
return parent[v] = find(parent[v]);
}
bool merge(int x, int y) {
int px = find(x);
int py = find(y);
if (px == py)
return false;
parent[px] = py;
return true;
}
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
DisJointSet dis(n+1);
while (m--)
{
int order, x, y;
cin >> order >> x >> y;
if (order) {
if (dis.find(x) == dis.find(y))
cout << "YES\n";
else
cout << "NO\n";
}
else
{
dis.merge(x, y);
}
}
return 0;
}
'Algorithm > Dis-Joint Set' 카테고리의 다른 글
Baekjoon 2463 비용 (0) | 2019.02.13 |
---|---|
Baekjoon 13306 트리 (0) | 2019.02.13 |
Baekjoon 4195 친구 네트워크 (2) | 2019.02.13 |