백준 Java_11724

InSeok·2023년 3월 13일
0

  • DFS 와 BFS 둘다 가능
  • 노드에서 DFS를 수행하고 처음 수행할 때만 수를 Count 해주고 (방문 이력이 없는 노드일 때만) 탐색 끝난 노드에 방문 처리를 하고 노드 1번 부터 마지막 노드까지 이 과정을 반복
  • 1번 노드가 2, 3, 5번 노드와 연결되어있다면 1번 노드만 DFS를 진행한다면 연결된 모든 요소는
    이미 방문 처리가 되어 2번과 3번, 5번 각각 DFS를 수행하려 해도 연결되어있는 요소로 보고 DFS가 돌지 않을 것이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {
    static StringBuilder sb = new StringBuilder();
    static boolean[] check;
    static int[][] arr;
    static Queue<Integer> q = new LinkedList<>();
    static int point, line ;
    static int count =0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
         point = Integer.parseInt(st.nextToken());
         line = Integer.parseInt(st.nextToken());
         check = new boolean[point + 1];
        arr = new int[point + 1][point + 1];

        for (int i = 0; i < line; i++) {
            StringTokenizer s = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(s.nextToken());
            int b = Integer.parseInt(s.nextToken());

            arr[a][b] = arr[b][a]=1;
        }
        for (int i = 1; i <= point; i++) {
            if (!check[i]) {
                count ++;
                bfs(i);
            }
        }

        System.out.println(count);

    }
    static void bfs(int start) {
        check[start] = true;
        q.add(start);

        while (!q.isEmpty()) {
            start = q.poll();
            for (int i = 1; i <= point; i++) {
                if (arr[start][i] == 1 & !check[i]) {
                    q.add(i);
                    check[i] = true;
                }
            }
        }

    }
    }
profile
백엔드 개발자

0개의 댓글