문제링크 : https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
전형적인 DFS 기본 문제였다.
그래프의 간선 연결을 2차원 배열에 표시하여 DFS로 표시된 곳을 탐색하고 방문 처리해줬다.
바이러스가 1번부터 점염되서 DFS에 인자를 1부터 시작해줬다.
출력할 때는 처음 감염시킨 1번 컴퓨터는 제외라고 문제에 적혀 있어서 answer-1을 해줬다.
성능 요약
메모리: 11612 KB, 시간: 76 ms
분류
그래프 이론(graphs), 그래프 탐색(graph_traversal), 너비 우선 탐색(bfs), 깊이 우선 탐색(dfs)
전체코드 (자바)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static boolean arr[][];
static boolean[] visited;
static int N;
static int answer;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int connected = Integer.parseInt(br.readLine());
// 연결되어있는 것을 알아야 하니깐
arr = new boolean [N+1][N+1];
visited = new boolean[N+1];
StringTokenizer st;
// 1. 그래프 정보 입력
for (int i = 1; i <= connected; i++) {
st = new StringTokenizer(br.readLine());
int cpu1 = Integer.parseInt(st.nextToken());
int cpu2 = Integer.parseInt(st.nextToken());
arr[cpu1][cpu2] = arr[cpu2][cpu1] = true;
}
// 2. dfs 및 결과 출력
dfs(1);
// 1번 컴퓨터는 문제에서 카운팅 제외하라고 나왔음
System.out.println(answer-1);
}
private static void dfs(int idx) {
answer++;
// 방문 체크
visited[idx] = true;
// for문 N대신 arr.length 넣으면 ArrayIndexOutOfBoundsException: 8
// dfs 방문 탐색
for (int i = 1; i <= N; i++) {
// 방문 안 했고 간선이 연결되어 있으면(=2차원 베열에 표시) dfs 진행
if(!visited[i] && arr[idx][i]) {
dfs(i);
}
}
}
}
'알고리즘 > DFS' 카테고리의 다른 글
[ALGO#13] 백준 11724_실버2_연결 요소의 개수 : DFS [JAVA] (0) | 2023.01.23 |
---|---|
[ALGO#8] 백준_15900_실버1_나무 탈출 : DFS [JAVA] (0) | 2023.01.19 |
[ALGO#6] 백준_1463_실버3_1로 만들기 : DFS [JAVA] (0) | 2023.01.17 |
[ALGO#5] 백준_1012_실버2_유기농배추 : DFS [JAVA] (0) | 2023.01.17 |
[ALGO#3] 백준_1303_실버1_전쟁-전투 : DFS와 BFS [JAVA] (2) | 2023.01.15 |