Blog

백준 1260: 인접 행렬로 DFS와 BFS 구현하기

백준 1260번: DFS와 BFS를 풀며 두 탐색 방식을 나란히 구현했습니다. 그래프는 인접 행렬 arr에, 방문 여부는 check에 저장했습니다.

같은 그래프를 두 번 탐색합니다

DFS는 현재 정점을 방문한 뒤 연결된 정점으로 재귀 호출합니다. BFS는 큐에서 정점을 하나씩 꺼내고 아직 방문하지 않은 이웃을 큐에 넣습니다. BFS에서는 큐에 넣는 순간 방문 표시를 해서 같은 정점이 중복으로 들어가지 않게 했습니다.

두 방식 모두 정점 번호를 작은 순서대로 확인합니다. DFS가 끝난 뒤에는 check를 새로 만들었습니다. 그래야 BFS가 앞선 탐색의 방문 기록에 영향을 받지 않습니다. 간선은 양방향으로 저장합니다.

당시 제출 코드

Java
import java.io.*;
import java.util.*;

class Main {
    public static boolean[] check;
    public static int[][] arr;
    public static Queue<Integer> q = new LinkedList<>();
    public static int N, M, V;
    public static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());

        arr = new int[N+1][N+1];

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            arr[a][b] = 1;
            arr[b][a] = 1;
        }
        check = new boolean[N+1];
        dfs(V);
        sb.append("\n");

        check = new boolean[N+1];
        bfs(V);
        bw.write(sb.toString());
        bw.flush();
    }

    public static void dfs(int start) {
        check[start] = true;
        sb.append(start).append(" ");

        for (int i = 0; i < N+1; i++) {
            if (arr[start][i] == 1 && !check[i]) {
                dfs(i);
            }
        }
    }

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

        while (!q.isEmpty()) {
            start = q.poll();
            sb.append(start).append(" ");

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