2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍
www.acmicpc.net
문제
풀이
그래프에서 1번 컴퓨터(노드)를 시작점으로 연결되어있는 컴퓨터들은 모두 바이러스에 감염된 것이기에
BFS , DFS 둘다 사용하여 풀 수 있다.
이번에는 DFS를 사용하여 풀었다.
재귀호출 , Stack 두 가지 경우를 둘다 사용해보았다.
import java.io.*;
import java.util.*;
public class Main {
static int[][] graph;
static boolean[] visited;
static int V,E,count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
V = Integer.parseInt(br.readLine());
E = Integer.parseInt(br.readLine());
// 1부터 시작
graph = new int[V + 1][V + 1];
visited = new boolean[V+1];
int v1,v2;
// 그래프 초기화
for (int i = 0; i < E; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
v1 = Integer.parseInt(st.nextToken());
v2 = Integer.parseInt(st.nextToken());
graph[v1][v2] = graph[v2][v1] = 1;
}
dfs_stack(1);
bw.write(count + "");
bw.flush();
bw.close();
}
public static void dfs(int startN) {
visited[startN] = true;
for (int i = 1; i <= V; i++) {
if (graph[startN][i] == 1 && !visited[i]) {
count++;
dfs(i);
}
}
}
public static void dfs_stack(int startN) {
Stack<Integer> stack = new Stack<>();
visited[startN] = true;
stack.push(startN);
while (!stack.isEmpty()) {
int node = stack.pop();
for (int i = 1; i <= V; i++) {
if (graph[node][i] == 1 && !visited[i]) {
visited[i] = true;
stack.push(i);
count++;
}
}
}
}
}
한 번 비슷한 문제를 풀고 나니 쉬웠다.
'baekjoon > Graph_Search' 카테고리의 다른 글
백준 16234번 : 인구 이동 자바 (0) | 2024.06.29 |
---|---|
백준 실버1 숨바꼭질 1697 (0) | 2024.06.26 |
백준 2667번 : 단지번호붙이기 자바 (1) | 2024.01.16 |
백준 2178번 : 미로탐색 자바 (0) | 2024.01.16 |
백준 1260번 : DFS와 BFS 자바 (0) | 2024.01.15 |