IT/BOJ 문제정리

백준 1717번: 집합의 표현

KimCookieYa 2021. 7. 23. 11:36

https://www.acmicpc.net/problem/1717

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

 

 

0. 알고리즘 분류

 자료 구조, 분리 집합

 

 

1. 문제

 

 

2. 풀이

 유니온 파인드(Uniono-Find)를 이용하는 기본 문제이다. SCPC 1번문제가 유니온파인드를 사용한 문제였어서 공부했다. 개념 자체는 어렵지 않다. 두 집합을 합하는 union 연산과 부모를 찾는 find 연산 뿐이다.

 

 

3. 코드

#include <bits/stdc++.h>

using namespace std;

int p[1000001];

int find(int i) {
	if (p[i] < 0) {
		return i;
	}
	
	p[i] = find(p[i]);
	return p[i];
}

void merge(int x, int y) {
	x = find(x);
	y = find(y);
	
	if (x == y) {
		return;
	}
	
	p[x] = y;
}

int main(void) {
	int n, m;
	scanf("%d %d", &n, &m);
	
	fill_n(p, n+1, -1);
	
	while (m--) {
		int op, x, y;
		scanf("%d %d %d", &op, &x, &y);
		
		if (op == 0) {
			merge(x, y);
		}
		else {
			x = find(x); y = find(y);
			if (x == y) {
				printf("YES\n");
			}
			else {
				printf("NO\n");
			}
		}
	}
	
	return 0;
}