본문 바로가기
알고리즘/UnionFind

집합의 표현 ( 백준 1717번 )

by 꽃요미 2025. 3. 3.

https://www.acmicpc.net/problem/1717

 

* UnionFind 알고리즘 문제

* 연산이 주어지는데

- 0이면 a가 포함되어있는 집합과 b가 포함되어 있는 집합을 합친다는 의미

- 1이면 두 원소가 같은 집합에 포함되어 있는지 확인하는 연산

* 1연산을 진행했을때 포함되었으면 YES, 아니면 NO를 출력하면 된다.

 

UnionFind 알고리즘 사용하기만 하면 풀리는 문제라서 개념은 따로 정리하겠다.

아래는 코드.

 

import java.io.*;
import java.util.*;

public class BOJ1717 {
    static int[] parents;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        parents = new int[N+1];
        for(int i = 0; i <= N; i++) {
            parents[i] = i;
        }
        for(int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int op = Integer.parseInt(st.nextToken());
            int nodeA = Integer.parseInt(st.nextToken());
            int nodeB = Integer.parseInt(st.nextToken());
            //union
            if(op == 0) {
                union(nodeA, nodeB);
            }
            //isConnected
            else {
                if(isConnected(nodeA, nodeB)) {
                    sb.append("YES").append("\n");
                }
                else {
                    sb.append("NO").append("\n");
                }
            }
        }
        System.out.println(sb);
    }
    private static int find(int node) {
        if(node != parents[node]) {
            node = find(parents[node]);
        }
        return parents[node];
    }
    private static void union(int nodeA, int nodeB) {
        int rootA = find(nodeA);
        int rootB = find(nodeB);

        if(rootA != rootB) {
            parents[rootB] = rootA;
        }
    }
    private static boolean isConnected(int nodeA, int nodeB) {
        return find(nodeA) == find(nodeB);
    }
}

 

* WQU ( Weighted Quick Union ) 까지는 사용하지 않고 Path Compression 사용하여 구현.

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

UnionFind 알고리즘 개념과 구현  (0) 2025.03.03