매일 조금씩

백준 1717번: 집합의 표현 본문

알고리즘

백준 1717번: 집합의 표현

mezo 2020. 3. 8. 20:31
728x90
반응형

 

 

Union_find를 활용하는 문제이다.

https://gimmesome.tistory.com/34

 

[1주차] Union-find

학교에서 알고리즘을 배울때도 Union-find는 따로 배운적은 없고 기억을 더듬어 보면... 다른 알고리즘에 포함되어 있는 걸로 배웠던것 같다. Union-find 강의를 보면서 관련 문제들을 풀어보다가 Union-find를 활..

gimmesome.tistory.com

 

 

 

시간 초과를 계속 겪다가 continue를 활용하여 시간을 줄인 코드를 보고 고치다가 틀렸다는 말이 계속 나와 몇번이고 확인하다가 결국 참고한 코드를 그대로 쓰게 됐는데 나중에 알고보니 Yes여서 틀린 거였다는...

영양가 없이 시간을 엄청 잡아 먹었던 문제...

 

 

 

 

#include <iostream>
#include <algorithm>
using namespace std;

const int MAX = 1000000 + 1;

int N, M;
int arr[MAX];

int findParent(int num) {
	//재귀함수 사용
	if (arr[num] < 0)
		return num;
	int parent = findParent(arr[num]);
	arr[num] = parent;
	return parent;

	//반복문 사용
	/*
	while(r != arr[r]){
		//arr[r] = arr[arr[r]];
		r = arr[r];
	}
	return r;
	*/
}

void merge(int aParent, int bParent) {
	/*
	부모노드의 배열값은 집합의 크기이고
	나머지 노드의 배열값은 부모노드를 가리킴
	합쳐지면서 부모노드 자리를 뺏긴 노드는 그 배열 값이 
	집합의 크기 --> 부모가된 노드 로 바뀜
	*/

	//집합의 크기가 큰 쪽으로 합쳐짐
	if (abs(arr[aParent]) >= abs(arr[bParent])) {
		arr[aParent] += arr[bParent];
		arr[bParent] = aParent;
	}
	else {
		arr[bParent] += arr[aParent];
		arr[aParent] = bParent;
	}
}

int main(void) {
	ios_base::sync_with_stdio(0);
	cin.tie(0);	//cin 실행속도 향상

	cin >> N >> M;

	for (int i = 0; i <= N; i++) {
		arr[i] = -1;
	}

	for (int i = 0; i < M; i++) {
		int op, a, b;
		cin >> op >> a >> b;
		
		if (op == 0) {
			if (a == b)
				continue;

			int aParent = findParent(a);
			int bParent = findParent(b);

			if (aParent == bParent)
				continue;

			merge(aParent, bParent);
		}
		else {
			if (a == b) {
				cout << "YES\n";
				continue;
			}

			int aParent = findParent(a);
			int bParent = findParent(b);
			if (aParent == bParent)
				cout << "YES\n";
			else
				cout << "NO\n";

		}
	}
	
	return 0;
}
728x90
반응형

'알고리즘' 카테고리의 다른 글

백준 10775번: 공항  (0) 2020.03.09
백준 1976번: 여행 가자  (0) 2020.03.08
백준 5218번: 알파벳 거리  (0) 2020.02.16
백준 5555번: 반지  (0) 2020.02.16
백준 5598번: 카이사르 암호  (0) 2020.02.12