백준/DFS, BFS

[백준 2606번 / Java] 바이러스

ghan2 2024. 5. 22. 15:06

- 노드를 양방향으로 연결시켜야 한다.

- bfs로 구현

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int N;
    static int M;
    static int[] visited;
    static Map<Integer, Set<Integer>> map;
    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        N = Integer.parseInt(br.readLine());
        M = Integer.parseInt(br.readLine());
        map = new HashMap<>();
        visited = new int[N+1];

        for(int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int key = Integer.parseInt(st.nextToken());
            int value = Integer.parseInt(st.nextToken());

            putMap(key, value);
            putMap(value, key);

        }
        bfs(1);

        System.out.println(count);

    }
    private static void putMap(int key, int value) {
        if(map.containsKey(key)) {
            map.get(key).add(value);
        } else {
            Set<Integer> list = new HashSet<>();
            list.add(value);
            map.put(key, list);
        }
    }

    private static void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(start);
        visited[start] = 1;

        while(!queue.isEmpty()) {
            int cur = queue.poll();
            if(map.containsKey(cur)) {
                Set<Integer> list = map.get(cur);
                for(Integer i : list) {
                    if(visited[i] == 0) {
                        queue.add(i);
                        count++;
                        visited[i] = 1;
                    }
                }
            }
        }

    }
}