-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathP051_SWEA3289_서로소집합.java
70 lines (52 loc) · 1.62 KB
/
P051_SWEA3289_서로소집합.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.util.Scanner;
// 서로소 집합
public class P051_SWEA3289_서로소집합 {
static int n;
static int[] parent;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = sc.nextInt();
for (int t = 1; t <= T; t++) {
StringBuilder answer = new StringBuilder();
n = sc.nextInt(); // n 개의 집합
int m = sc.nextInt(); // 입력으로 주어지는 연산의 개수
make(); // 서로소 집합 생성
for (int i = 0; i < m; i++) {
int value = sc.nextInt(); // 0은 union의 의미, 1은 포함되어 있는지 확인하는 연산
int a = sc.nextInt();
int b = sc.nextInt();
if (value == 0) { // 0일 때
union(a, b); // 집합 합치기
} else { // 1일 때 - 같은 부모인지 확인
if (check(a, b)) answer.append(1);
else answer.append(0);
}
}
sb.append("#" + t + " " + answer + "\n");
}
System.out.println(sb);
}
static void make() {
parent = new int[n + 1];
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
}
static int find(int a) { // a의 대표자 찾기
if (parent[a] == a) return a;
return parent[a] = find(parent[a]); // 우리의 대표자를 나의 부모로.. : path compression
}
static void union(int a, int b) { // 집합 합치기
int aRoot = find(a);
int bRoot = find(b);
if (aRoot == bRoot) return;
parent[bRoot] = aRoot;
}
static boolean check(int a, int b) { // 같은 부모인지 확인
int aRoot = find(a);
int bRoot = find(b);
if (aRoot == bRoot) return true;
return false;
}
}