1717번: 집합의 표현
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는
www.acmicpc.net
[문제 풀이]
유니온 파인드를 이용하여 문제를 풀었습니다.
이 집합의 원소들이 주어 졌을 때 0,1을 통해 원소의 집합을 합쳐주고 같은지 확인 하는 문제였습니다. 전형적인 유니온 파인드 문제임으로 이론은 아래 링크에 들어가시면 자세히 설명 되있습니다.
steady-life.tistory.com/128?category=788590
서로소 집합(Disjoint Set, Union-Find)
서로소 집합 교집합이 공집합인 집합(서로소 집합)들의 정보를 확인(Find)하고 조작(Union)할 수 있는 자료구조 2가지 연산으로 이루어져 있습니다 Union 연산 - 어떤 두 원소 a, b 에 대해서 union(a, b)
steady-life.tistory.com
코드 설명
- n, m 을 입력 받고 배열 n을 초기화 시켜줍니다.
- m 만큼 반복하며 첫 번째 값이 0인 경우 union을 시켜줍니다.
- 첫 번째 값이 1인 경우 집합의 부모 값을 확인하여 같으면 "YES", 틀리면 "NO"를 출력합니다.
[코드]
import java.io.*;
import java.util.*;
class Main{
static int[] parent;
public static void union(int a, int b) {
int parent_a = find(a);
int parent_b = find(b);
parent[parent_b] = parent_a;
}
public static int find(int a) {
if(parent[a] == a)
return a;
else
return parent[a] = find(parent[a]);
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
parent = new int[n+1];
for(int i = 0; i <= n; i++)
parent[i] = i;
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int c = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if(c == 0)
union(a, b);
else {
if(find(a) == find(b))
System.out.println("YES");
else
System.out.println("NO");
}
}
}
}
'algorithm > BOJ' 카테고리의 다른 글
백준 2156_포도주 시식(JAVA) (0) | 2021.04.23 |
---|---|
백준 1463_1로 만들기(JAVA) (0) | 2021.04.22 |
백준 1926_그림(JAVA) (0) | 2021.04.14 |
백준 2583_영역 구하기(JAVA) (0) | 2021.04.09 |
백준 17471_게리맨더링(C++) (0) | 2020.11.05 |