https://www.acmicpc.net/problem/11724
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int[][] arr;
static boolean[] visited;
static Queue<Integer> queue = new LinkedList<>();
public static void dfs(int v) {
if (visited[v]) return;
visited[v] = true;
for (int i = 1; i <= n; i++) {
if (arr[v][i] == 1 && !visited[i]) { // 연결된 정점이고 방문하지 않았다면
dfs(i);
}
}
}
public static void bfs(int v) {
queue.add(v);
visited[v] = true;
while (!queue.isEmpty()) {
v = queue.poll();
for (int i = 1; i <= n; i++) {
if (arr[v][i] == 1 && !visited[i]) {
queue.add(i);
visited[i] = true;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[n + 1][n + 1];
visited = new boolean[n + 1];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
arr[u][v] = arr[v][u] = 1;
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
cnt++;
// dfs(i);
bfs(i);
}
}
System.out.println(cnt);
}
}
양방향 그래프이므로 배열 [u][v]와 [v][u] 에 모두 표시를 해주고,
노드의 개수만큼 노드들을 탐색하며 방문하지 않은 노드일 경우 cnt를 증가하고 dfs로 깊이 탐색하면서 하나씩 연결해나가면 된다.
+bfs로도 풀어서 추가하였다.
'ALGORITHM' 카테고리의 다른 글
[JAVA] 백준 2750번 - 수 정렬하기 (0) | 2022.09.20 |
---|---|
[JAVA] 백준 1260번 - DFS와 BFS (0) | 2022.09.18 |
[JAVA] 백준 2606번 - 바이러스 (0) | 2022.09.17 |
[JAVA] 백준 1436번 - 영화감독 숌 (0) | 2022.09.16 |
[JAVA] 백준 1018번 - 체스판 다시 칠하기 (0) | 2022.09.15 |