Blog

B24444-너비-우선-탐색-1

날짜 2024-04-08
사용 언어 Java
문제 유형 #bfs#graphs#graph_traversal#sorting
문제 URL https://www.acmicpc.net/problem/24444

문제 #

문제 설명 #
제한사항 #

나의 풀이 #

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        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());

        int[][] graphs = new int[N + 1][M + 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());

            graphs[a][b] = 1;
            graphs[b][a] = 1;
        }
        br.close();

        // 방문 여부를 저장 할 배열
        boolean[] isVisited = new boolean[N + 1];

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

        bfs(graphs, isVisited, R, visitOrder);

        StringBuilder sb = new StringBuilder();
        // 1부터 시작이므로 기본 for 문 사용
        for (int i = 1; i <= N; i++) {
            sb.append(visitOrder[i]).append("\n");
        }

        System.out.println(sb);
    }

    public static void bfs(int[][] graph,
                           boolean[] visited,
                           int start,
                           int[] visitOrder) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(start);

        visited[start] = true; // 시작 정점을 방문했다고 표시
        int order = 1;

        while (!queue.isEmpty()) {
            int vertex = queue.poll();
            visitOrder[vertex] = order++;

            // 현재 정점과 인접한 모든 정점을 확인
            for (int i = 1; i < graph.length; i++) {
                // 인접하고 아직 방문하지 않은 정점이 있다면
                if (graph[vertex][i] == 1 && !visited[i]) {
                    visited[i] = true; // 해당 정점을 방문했다고 표시
                    queue.offer(i); // 큐에 추가
                }
            }
        }
    }
}

실행결과

다른 사람의 풀이 #



관련개념 학습 #