https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a
www.acmicpc.net
위 문제는 n + 1개의 집합을 서로 합치고, 특정 원소가 같은 집합인지를 확인하는 문제이다.
이는 Union-Find 구조를 이용하면 쉽게 풀 수 있다.
#include <stdio.h>.
int n, m;
int t[1000001];
int find(int x)
{
if (t[x] == x) return x;
else return (t[x] = find(t[x]));
}
void merge(int x, int y)
{
x = find(x);
y = find(y);
t[y] = x;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
t[i] = i;
for (int i = 0; i < m; i++)
{
int o, a, b;
scanf("%d%d%d", &o, &a, &b);
if (o == 0)
merge(a, b);
else
{
if (find(a) == find(b))
puts("YES");
else
puts("NO");
}
}
}'Problem Solving' 카테고리의 다른 글
| [BOJ 1806] 부분합 (0) | 2020.04.17 |
|---|---|
| [BOJ 13398] 연속합 2 (0) | 2020.04.17 |
| [BOJ 5247] 불 (0) | 2020.04.08 |
| [BOJ 2352] 반도체 설계 (0) | 2020.04.08 |
| [BOJ 14002] 가장 긴 증가하는 부분 수열 4 (0) | 2020.04.07 |