import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer>[] graph;
static boolean[] visited;
static int count;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
graph = new ArrayList[n+1];
for(int i=1;i<n+1;i++) {
graph[i] = new ArrayList<>();
}
visited = new boolean[n+1];
for(int i=0;i<m;i++) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph[a].add(b);
graph[b].add(a);
}
count = 0;
solution(n);
bw.write(count+"");
bw.flush();
bw.close();
br.close();
}
public static void solution(int n) {
for(int i=1;i<n+1;i++) {
if(!visited[i]) {
dfs(i);
count++;
}
}
}
public static void dfs(int node) {
visited[node] = true;
for(int next : graph[node]) {
if(!visited[next]) {
dfs(next);
}
}
}
}
- visited = new boolean[n+1]; 이 배열 초기화 과정 절대 잊지 않기
- graph = new ArrayList[n+1];
for(int i=1;i<n+1;i++) {
graph[i] = new ArrayList<>();
} 이것도 마찬가지
- if(!visited[i]) {
dfs(i);
count++;
} 방문한적이 없는 곳만 dfs() 돌리는 로직으로 몇개의 뭉텅이로 트리가 구성되어 있는지 알 수 있다.