본문 바로가기
코딩캠프/BOJ

[1717] 집합의 표현

by 코곰_ 2024. 2. 19.
// 1717 집합의 표현  
// union find
// 경로압축 -> 대표 루트로 업데이트해준다. 
#include <bits/stdc++.h>
#define NMAX 1000001
using namespace std;

int n, m; 
int cmd, a, b;
int parent[NMAX+1];

int getParent(int a){
	if(parent[a] == a) return a;
	return parent[a] = getParent(parent[a]); // find 한 값을 배열에 저장 후 반환  
	//return getParent(parent[a]);
}
bool find(int a, int b){ 
	// 같은 집합이면 true, 아니면 false  
	int x = getParent(a);
	int y = getParent(b);
	return x == y;
}
void _union(int a, int b){
	// 최상위 부모 
	int x = getParent(a);
	int y = getParent(b);
	
	if (x<y) parent[y] = parent[x];
	else parent[x] = parent[y]; 

}


int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	// n: 0 ~ n+1개의 집합 1 ~ 1,000,000
	// m: 입력으로 주어지는 연산의 개수 1 ~ 100,000
	scanf("%d %d", &n, &m);
	
	// 초기화
	for(int i=0; i<n+1; i++){
		parent[i] = i;
	} 
	
	for(int i=0; i<m; i++){
		scanf("%d %d %d", &cmd, &a, &b);
		if (cmd == 0){ // a가 포함되어 있는 집합과 b가 포함되어 있는 집합을 합친다  
			_union(a, b); // 같은 집합으로 만든다 
		}
		else{ // 두 원소가 같은 집합에 포함되어 있는지 
		// a와 b가 같은 집합에 포함되어 있으면  
		if (find(a, b))	printf("yes\n"); 
		// 그렇지 않다면  
		else	printf("no\n");
		}
	} 
	return 0;
}

'코딩캠프 > BOJ' 카테고리의 다른 글

[1922] 네트워크 연결  (1) 2024.02.20
[2252] 줄 세우기  (1) 2024.02.19
[2042] 구간 합 구하기  (1) 2024.02.15
[1991] 트리순회  (0) 2024.02.14
[2096] 내려가기  (0) 2024.02.14