알고리즘/그래프

Union - Find

kark 2024. 3. 2. 16:16
728x90

해당 알고리즘 설명은 자료구조탭의 'DisjointSet 서로소집합' 글 참조

https://kark.tistory.com/15

 

서로소집합 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