[BOJ] 1260 DFS와 BFS

iinnuyh_s·2023년 6월 22일
0

BFS/DFS

목록 보기
3/16

DFS와 BFS

풀이

  • ArrayList 배열로 구현
  • boolean 배열로 방문처리
  • 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 라는 조건 때문에 ArrayList 배열 정렬함(Collections.sort 사용)
  • StringBuilder 사용해서 출력

코드

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

public class BOJ1260 {
    static ArrayList<Integer>[] nodeList;
    static boolean[] visited;
    static int N, M, V;
    static StringBuilder sb;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken())-1;
        nodeList = new ArrayList[N];
        for (int i = 0; i < N; i++)
            nodeList[i] = new ArrayList<>();
        visited = new boolean[N];
        sb = new StringBuilder();
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken()) - 1;
            int B = Integer.parseInt(st.nextToken()) - 1;
            nodeList[A].add(B);
            nodeList[B].add(A);
        }
        for (int i = 0; i < N; i++) {
            Collections.sort(nodeList[i]);
        }

        dfs(V);
        sb.append("\n");
        visited = new boolean[N];

        bfs(V);
        System.out.println(sb);

    }

    private static void bfs(int start) {
        visited[start] = true;
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(start);
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            sb.append(cur+1).append(" ");
            for (int next : nodeList[cur]) {
                if (!visited[next]) {
                    queue.offer(next);
                    visited[next] = true;
                }
            }
        }
    }

    private static void dfs(int start) {
        visited[start] = true;
        sb.append(start+1).append(" ");
        for (int next : nodeList[start]) {
            if (!visited[next]) {
                dfs(next);
            }
        }
    }
}

0개의 댓글