[알고리즘문제]

[백준] 24480 깊이우선탐색2

whatezlife 2025. 2. 27. 17:37
package 문제24480깊이우선탐색2;

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

public class Main2 {
    static List<Integer>[] arr; // 인접 리스트
    static int[] visitOrder; // 방문 순서 저장 배열
    static boolean[] visited; // 방문 여부 배열
    static int order = 1; // 방문 순서 카운트

    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("res/문제24480깊이우선탐색2.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken()); // 정점 수
        int M = Integer.parseInt(st.nextToken()); // 간선 수
        int R = Integer.parseInt(st.nextToken()); // 시작 정점

        arr = new ArrayList[N + 1];
        visitOrder = new int[N + 1]; // 방문 순서를 저장할 배열
        visited = new boolean[N + 1];

        for (int i = 1; i <= N; i++) {
            arr[i] = new ArrayList<>();
        }

        // 간선 입력 받기
        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].add(B);
            arr[B].add(A);
        }

        // **각 정점의 인접 리스트를 내림차순으로 정렬**
        for (int i = 1; i <= N; i++) {
            arr[i].sort(Collections.reverseOrder());
        }

        // **DFS 실행 (한 번만 실행하면 됨)**
        dfs(R);

        // **모든 정점의 방문 순서 출력 (방문하지 않은 정점은 0 출력)**
        for (int i = 1; i <= N; i++) {
            System.out.println(visitOrder[i]);
        }
    }

    public static void dfs(int node) {
        visited[node] = true;
        visitOrder[node] = order++; // 현재 정점 방문 순서 기록

        for (int next : arr[node]) { // 인접 노드 탐색
            if (!visited[next]) {
                dfs(next);
            }
        }
    }
    public static void bfs(int node) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(node);
        visited[node] = true; // ✅ 방문 체크를 Queue에 추가할 때 해야 함!
        visitOrder[node] = order++;

        while (!queue.isEmpty()) {
            int current = queue.poll(); // Queue에서 꺼냄

            for (int next : arr[current]) {
                if (!visited[next]) { // ✅ 방문하지 않은 경우에만 Queue에 추가
                    queue.add(next);
                    visited[next] = true; // ✅ Queue에 추가할 때 방문 체크
                    visitOrder[next] = order++; // 방문 순서 저장
                }
            }
        }
    }

}