나를 기록하다
article thumbnail
반응형

문제

https://www.acmicpc.net/problem/24445

 

24445번: 알고리즘 수업 - 너비 우선 탐색 2

첫째 줄에 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤ N)이 주어진다. 다음 M개 줄에 간선 정보 u v가 주어지며 정점 u와 정점 v의 가중치 1인 양

www.acmicpc.net

백준(baekjoon) 24445 알고리즘 수업 - 너비 우선 탐색 2

문제 분석

그래프와 정렬, bfs를 이용하여 너비 우선 탐색을 하는 문제이다.

- BufferedReader, BufferedWriter, StringTokenizer을 사용하여 입출력을 좀 더 효율적으로 구현

- Collections.sort()와 reverseOrder()를 이용하여 내림차순 정렬

- 재귀 BFS를 이용하여 너비 우선 탐색을 해결

 

정답 코드

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

public class Main {
    static int vertex, edge, startVertex, count = 1; //정점, 간선, 시작 정점, 개수
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>(); //그래프 값 저장
    static int[] result; //순번 저장 배열
    static boolean[] visited; //방문 확인 배열

    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()); //그래프 값 저장

        vertex      = Integer.parseInt(st.nextToken());
        edge        = Integer.parseInt(st.nextToken());
        startVertex = Integer.parseInt(st.nextToken());

        result  = new int[vertex + 1];
        visited = new boolean[vertex + 1];

        for (int i = 0 ; i <= vertex ; i++) {
            graph.add(new ArrayList<>());
        }

        for (int i = 0 ; i < edge ; i++) {
            st = new StringTokenizer(br.readLine());
            int fromVertex = Integer.parseInt(st.nextToken());
            int toVertex = Integer.parseInt(st.nextToken());
            // 무방향이기 때문에 양쪽으로 정보를 추가
            graph.get(fromVertex)
                 .add(toVertex);
            graph.get(toVertex)
                 .add(fromVertex);
        }

        //너비 우선 탐색 수행
        bfs(startVertex);

        for (int i = 1 ; i <= vertex ; i++) {
            bw.write(result[i] + "\n");
        }
        bw.flush(); //결과 출력
        bw.close();
        br.close();
    }

    private static void bfs(int vertex) {
        Queue<Integer> queue = new LinkedList<Integer>();
        result[vertex]  = count++; //순번 저장
        visited[vertex] = true; //방문 확인
        queue.add(vertex);
        while (!queue.isEmpty()) {
            int point = queue.poll();
            Collections.sort(graph.get(point), Collections.reverseOrder());
            for (int next : graph.get(point)) { //인접 정점 탐색
                if (!visited[next]) { //방문했는지 확인
                    visited[next] = true; //방문 확인
                    result[next]  = count++; //순번 확인
                    queue.add(next);
                }
            }
        }
    }
}
반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...