728x90
해당 알고리즘 설명은 자료구조탭의 'DisjointSet 서로소집합' 글 참조
서로소집합 DisjointSet
각 원소가 집합을 이루게 하거나, 집합을 관리하기 위해 사용되는 자료구조 각 원소가 어떤 집합에 속하는지 빠르게 찾아내고 두개의 집합을 하나로 합치는 연산을 지원한다. 최소 신장트리 알
kark.tistory.com
문제 https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
풀이
using System.Text;
int[] input = Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
int n = input[0];
int m = input[1];
DisjointSet set = new DisjointSet();
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= n; i++)
{
set.Add(i);
}
for (int i = 0; i < m; i++)
{
input = Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
if(input[0] == 0)
set.Union(input[1],input[2]);
else
{
if(set.Find(input[1]) == set.Find(input[2]))
sb.AppendLine("YES");
else
sb.AppendLine("NO");
}
}
System.Console.WriteLine(sb);
class DisjointSet
{
Dictionary<int,int> dic;
public DisjointSet()
{
dic = new Dictionary<int, int>();
}
public void Add(int element)
{
if(!dic.ContainsKey(element))
dic.Add(element,element);
}
public void Union(int x, int y)
{
if(!dic.ContainsKey(x))
return;
if(!dic.ContainsKey(y))
return;
x = Find(x);
y = Find(y);
int min = Math.Min(x,y);
int max = Math.Max(x,y);
dic[max] = min;
}
public int Find(int element)
{
if(!dic.ContainsKey(element))
return int.MaxValue;
if(dic[element] != element)
dic[element] = Find(dic[element]);
return dic[element];
}
}
미흡한부분이나 개선될수 있는 부분이 있으면 답글 남겨주세요
'알고리즘 > 그래프' 카테고리의 다른 글
MST 최소신장트리 - 프림 알고리즘 (0) | 2024.03.03 |
---|---|
MST 최소신장트리 - 크루스칼 알고리즘 (0) | 2024.03.02 |
Dijkstra 다익스트라 (0) | 2024.03.02 |
DFS 깊이우선탐색 (0) | 2024.02.27 |
BFS 너비우선탐색 (0) | 2024.02.26 |