본문 바로가기
Problem Solving

[BOJ 1717] 집합의 표현

by Ladun 2020. 4. 8.

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