티스토리 뷰

알고리즘

유니온 파인드 정리 C++

4567은 소수 2024. 4. 21. 19:44

유니온 파인드 알고리즘은 무향 그래프에서 disjoint set을 union 하는 과정입니다. 

(유향 그래프의 경우, SCC에서 사용하는 타잔, 코사라주 등 이용)

 

각 그래프 노드의 부모 노드를 찾고, find 하는 과정을 반복합니다.

이 때 부모 노드는 단순히 바로 연결된 노드가 아닌, 최상위로 찾을 수 있는 부모를 의미합니다. 

 

따라서 사이클이 발생하는 경우는 두 노드의 부모 노드가 동일한 경우입니다. 

예를 들어, 1-2 / 2-3 / 2-4/ 3-4 와 같은 연결이 주어진다면, 3-4의 입력 때 사이클이 발생합니다. 

(부모 기준 : 작은 값이 부모)

 

코드는 다음과 같습니다.

 

#include <iostream>

using namespace std;

int find_parent(int node, int parent[])
{
	if(node == parent[node])
		return node;
	parent[node] = find_parent(parent[node], parent);
	return parent[node];	
} 

void union_nodes(int node1, int node2, int parent[])
{
	// 작은 값이 부모 노드 되도록
	int parent1 = find_parent(node1, parent);
	int parent2 = find_parent(node2, parent);
	
	// 부모 같은 경우 : cycle 발생 
	if(parent1 == parent2) {
		cout << "cycle!!!\n";
	}
	
	else if(parent1 < parent2)
		parent[parent2] = parent1;
	else
		parent[parent1] = parent2;
		
	cout << "node1 : " << node1 << " parent1 : " << parent1 << "\n";
	cout << "node2 : " << node2 << " parent2 : " << parent2 << "\n";
	
	return;
}

int main()
{
	// 작은 값이 부모 되도록 union find 
	
	// 입력
	// 1-2
	// 2-3
	// 2-4
	// 3-4 => cycle 발생 
	
	 // 각 노드의 부모 노드 처음에는 자기 자신 
	 int parent[5] = {0,1,2,3,4};
	 
	 union_nodes(1,2,parent);
	 union_nodes(2,3,parent);
	 union_nodes(2,4,parent);
	 union_nodes(3,4,parent); 
}

 

 

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

C++ vector, priority_queue 정렬 정리  (1) 2024.04.21
MST 구하기 정리 C++  (0) 2024.04.21
벨만 포드 정리 C++  (2) 2024.04.21
플로이드 워셜 C++  (0) 2024.04.21
다익스트라 C++ (heap으로 빠르게 계산 포함)  (0) 2024.04.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함