DFS와 BFS


백준 [1260] DFS와 BFS

문제보기
Alt text

풀이

노드와 간선 관계를 2차원 배열로 표현하고, 간선이 연결된 곳은 1로 표시한다.
양방향이므로 각 노드 번호에 해당하는 배열에 둘 다 1로 표시하고 DFS, BFS를 구현한다

소스코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt(); // 정점 갯수
        int M = sc.nextInt(); // 간선 갯수
        int V = sc.nextInt(); // 탐색 시작 번호
        int[][] map = new int[N + 1][N + 1];

        for (int i = 0; i < M; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();

            map[a][b] = 1;
            map[b][a] = 1;
        }

        boolean[] dfsVisited = new boolean[N + 1];
        dfsVisited[V] = true;
        dfs(map, dfsVisited,  V);

        System.out.println();
        bfs(map, V);
    }

    private static void dfs(int[][] map, boolean[] visited, int currentNum) {
        System.out.print(currentNum + " ");

        for (int i = 1; i < map.length; i++) {
            if (map[currentNum][i] == 1 && !visited[i]) {
                visited[i] = true;
                dfs(map, visited, i);
            }
        }
    }

    private static void bfs(int[][] map, int startNum) {
        Queue<Integer> queue = new ArrayDeque<>();
        boolean[] visited = new boolean[map.length];

        queue.add(startNum);
        visited[startNum] = true;

        while (!queue.isEmpty()) {
            int currentNum = queue.poll();
            System.out.print(currentNum + " ");

            for (int i = 1; i < map.length; i++) {
                if (map[currentNum][i] == 1 && !visited[i]) {
                    visited[i] = true;
                    queue.add(i);
                }
            }
        }

        System.out.println();
    }
}