728x90
https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는
www.acmicpc.net
이코테, 자료구조에서도 배웠었던 find-union 알고리즘이다.
오랜만에 짜보니 대충은 생각나도 제대로 구현하기가 좀 힘들었는데
이코테에서 배웠던 알고리즘이 조금 더 간단했던것 같아서
그때 배운 그대로 작성 해 봤다.
2022.08.08 - [파이썬 공부/이코테] - 8. 기타 그래프 이론: 서로소 집합 자료구조 union, find
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P1717 {
public static void main(String[] args) throws IOException {
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());
int[] 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 a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if (a == 0) {
union(parent, b, c);
} else if (a == 1) {
int parent_b = find(parent, b);
int parent_c = find(parent, c);
if (parent_b == parent_c) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
private static int find(int[] parent, int x) {
if (parent[x] != x) {
parent[x] = find(parent, parent[x]);
}
return parent[x];
}
private static void union(int[] parent, int b, int c) {
int parent_b = find(parent, b);
int parent_c = find(parent, c);
if (parent_b < parent_c) {
parent[parent_b] = parent_c;
} else {
parent[parent_c] = parent_b;
}
}
}
728x90
'코딩 > 백준-자바' 카테고리의 다른 글
[자바] 1735번: 분수 합 (0) | 2023.01.30 |
---|---|
[자바] 백준 2252번: 줄 세우기 (0) | 2023.01.29 |
[자바] 백준 2042번: 구간합 구하기(실패) (0) | 2023.01.28 |
[자바] 백준 1991번: 트리 순회 (0) | 2023.01.27 |
[자바] 백준 2748번: 피보나치 수2 (0) | 2023.01.26 |
댓글