728x90
반응형
1717번: 집합의 표현
문제
https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
풀이
유니온 파인드 구조 연습 문제다. 두 가지 연산이 있는데 집합을 합치는 연산과 두 원소가 같은 집합 안에 있는지 확인하는 연산이 있다. 첫 번째 연산은 당연히 union하는 연산이고 두 번째 연산은 두 원소를 find한 값이 같은지 여부를 확인하는 연산이다. 문제에 주어진 대로 코드를 작성하기만 하면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
vector<int> p;
int find(int x) {
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if (x < y)
p[y] = x;
else
p[x] = y;
}
void check(int x, int y) {
cout << (find(x) == find(y) ? "YES\n" : "NO\n");
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
p.resize(n + 1);
iota(p.begin(), p.end(), 0);
while (m--) {
int c, a, b;
cin >> c >> a >> b;
if (c)
check(a, b);
else
merge(a, b);
}
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 9373 복도 뚫기 (12) | 2023.03.28 |
---|---|
[백준 / BOJ] C++ 1976 여행 가자 (4) | 2023.03.28 |
[백준 / BOJ] C++ 2638 치즈 (0) | 2023.03.28 |
[백준 / BOJ] C++ 2143 두 배열의 합 (2) | 2023.03.28 |
[백준 / BOJ] C++ 27920 카드 뒤집기 (6) | 2023.03.27 |