문제 요약 - 1번 정점에서 탐색할 수 있는 정점 개수를 구하시오.
" 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터 수 "라서 1번은 제외하고 카운트한다.
dfs, bfs 어떤 방식을 채택해도 풀 수 있지만 나는 코드가 짧은 dfs 알고리즘이 좋다.
이번 문제는 친절하게 그림까지 그려져 있어서 설명하는 척이라도 할만한 건덕지가 없다.. 날로 먹는군.
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<ArrayList<Integer>> edgeList = new ArrayList<>();
static boolean[] visited;
static int count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 컴퓨터 수(정점)
int computers = Integer.parseInt(br.readLine());
// 연결되어 있는 컴퓨터 쌍의 수(간선)
int edges = Integer.parseInt(br.readLine());
// 정점 생성(시작 번호 1)
for (int i=0; i<computers+1; i++) {
edgeList.add(new ArrayList<>());
}
// 간선 배열(무방향) 생성
for (int i=0; i<edges; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int edge1 = Integer.parseInt(st.nextToken());
int edge2 = Integer.parseInt(st.nextToken());
edgeList.get(edge1).add(edge2);
edgeList.get(edge2).add(edge1);
}
// 방문 체크 배열 생성 (시작이 1번)
visited = new boolean[computers+1];
dfs(1);
System.out.println(count);
}
static void dfs(int computerNum) {
// 이미 방문한 정점은 체크하지 않음
visited[computerNum] = true;
// 해당 컴퓨터(정점)에서 연결된 다른 컴퓨터(정점) 탐색
for ( int n : edgeList.get(computerNum) ) {
if ( !visited[n] ) {
// 아직 방문하지 않았을 경우
dfs(n);
count++;
}
}
}
}
'CS ﹒ Algorithm > Baekjoon' 카테고리의 다른 글
Java 백준 문제풀이 (33) 2667: 단지 번호 붙이기 (0) | 2022.08.01 |
---|---|
Java 백준 문제풀이 (32) 1260: DFS와 BFS (0) | 2022.07.31 |
Java 백준 문제풀이 (30) 11725: 트리의 부모 찾기 (0) | 2022.07.29 |
Java 백준 문제풀이 (29) 2444: 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2022.07.28 |
Java 백준 문제풀이(28) 24479: 알고리즘 수업 - 깊이 우선 탐색1 (+24480 깊이 우선 탐색2) (0) | 2022.07.27 |