코딩뚠뚠

[기본문제풀이] union_find 본문

알고리즘 문제풀이/기본문제풀이

[기본문제풀이] union_find

로디네로 2020. 12. 28. 00:32
반응형

 

풀이 일시 : 2020-08-06

합집합찾기 :

대표적인 그래프알고리즘이며 서로소집합 알고리즘이라고도 한다. 여러개의 노드가 존재할 때 두개의 노드를 선택해서 현재 이 두 노드가 서로 같은 그래프에 속하는지 판별하는 알고리즘이다.

문제 :

union find로 연결여부를 판단한다.

풀이 :

연결되어있다면 같은 부모를 갖게끔 초기화 해준다. 소속을 같게 해준다.

 

#include <stdio.h>

int getParent(int parent[], int x) { //핵심 재귀알고리즘
	if (parent[x] == x) return x;
	return parent[x] = getParent(parent, parent[x]); //계속 찾아들어간다
}

void unionParent(int parent[], int a, int b) {
	a = getParent(parent, a);
	b = getParent(parent, b);
	if (a < b) parent[b] = a;
	else parent[a] = b;
}

int findParent(int parent[], int a, int b) { //현재집합에 속하는지확인
	a = getParent(parent, a);
	b = getParent(parent, b);
	if (a == b) return 1; //현재집합에 속한다.
	else return 0; //현재집합에 속하지않는다.
}

int main() {
	int parent[11];
	for (int i = 1; i <= 10; i++) {
		parent[i] = i;
	} //각자의 parent를 각자의 수로 초기화한다.
	unionParent(parent, 1, 2);
	unionParent(parent, 2, 3);
	unionParent(parent, 3, 4);
	unionParent(parent, 5, 6);
	unionParent(parent, 6, 7);
	unionParent(parent, 7, 8);
	printf("1과 5는 연결되어있나요? %d\n", findParent(parent, 1, 5));
	unionParent(parent, 1, 5);
	printf("1과 5는 연결되어있나요? %d\n", findParent(parent, 1, 5));
}
반응형