자르비 왕국
[SW Acamedy] 7465 창용 마을 무리의 개수 - JAVA 본문
1. 문제 유형 : Union-Find
2. 시간복잡도 : O(MN)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = null;
int T = Integer.parseInt(in.readLine());
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(in.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] parents = new int[N+1];
for (int i = 0; i < N+1; i++) {
parents[i] = i;
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(in.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
union(parents, from, to);
}
int answer = 0;
boolean[] isRoot = new boolean[N+1];
for (int i = 1; i < N+1; i++) {
int root = findSet(parents, i);
if(!isRoot[root]) {
isRoot[root] = true;
answer++;
}
}
sb.append("#").append(tc).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
public static int findSet(int[] parents, int a) {
if(parents[a] == a) return a;
return parents[a] = findSet(parents, parents[a]);
}
public static void union(int[] parents, int a, int b) {
int aRoot = findSet(parents, a);
int bRoot = findSet(parents, b);
if(aRoot == bRoot) return;
parents[bRoot] = aRoot;
}
}
'문제풀이' 카테고리의 다른 글
[백준] 15686 치킨 배달 - JAVA (0) | 2022.02.23 |
---|---|
[백준] 16236 아기상어 - JAVA (0) | 2022.02.23 |
[SW Academy] 3289 서로소 집합 - JAVA (0) | 2022.02.23 |
[백준] 16926 배열 돌리기 1 - JAVA (0) | 2022.02.09 |
[백준] 16935 배열 돌리기3 - JAVA (0) | 2022.02.09 |