득이공간

[백준 C++] 1717 집합의 표현 - 분리집합 본문

PS/알고리즘 문제풀이

[백준 C++] 1717 집합의 표현 - 분리집합

쟁득 2024. 2. 1. 16:04
 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net

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

vector<int> RootNode;

int Find(int Node)
{
	if (Node == RootNode[Node])
	{
		return Node;
	}

	return RootNode[Node] = Find(RootNode[Node]);
}

void Union(int NodeA, int NodeB)
{
	int RootNodeA = Find(NodeA);
	int RootNodeB = Find(NodeB);

	int MinRootNode = min(RootNodeA, RootNodeB);
	RootNode[RootNodeA] = MinRootNode;
	RootNode[RootNodeB] = MinRootNode;
}

bool Determine(int NodeA, int NodeB)
{
	return (Find(NodeA) == Find(NodeB));
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;

	RootNode.reserve(N + 1);
	for (int i = 0; i < N + 1; ++i)
	{
		RootNode.emplace_back(i);
	}

	for (int i = 0; i < M; ++i)
	{
		int Option, A, B;
		cin >> Option >> A >> B;

		if (Option == 0)
		{
			Union(A, B);
			continue;
		}

		if (Determine(A, B))
		{
			cout << "YES" << '\n';
		}
		else
		{
			cout << "NO" << '\n';
		}
	}
}

유니온 파인드 알고리즘을 사용해서 풀었습니다.

 

유니온 연산에서 집합을 합칠 때

해당 노드의 루트값을 변경하는 것이 아니라

루트 노드의 루트값을 변경해주는 것이 중요합니다.