문제풀이
[SW Acamedy] 7465 창용 마을 무리의 개수 - JAVA
자르비옹스
2022. 2. 23. 13:01
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;
}
}