알고리즘/그래프 탐색

[BOJ 18352] 특정 거리의 도시 찾기 (Java, BFS)

leejinwoo1126 2023. 6. 12. 12:00
반응형


문제 링크 

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

 

18352번: 특정 거리의 도시 찾기

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개

www.acmicpc.net


풀이 

- BFS 활용하여 X 부터 다른 노드까지의 거리 배열 구한 후 K에 해당하는 거리값을 가지는 노드 오름차순으로 풀이 

- 간선의 비용이 1이기 때문에 최단 거리가 아닌 BFS 만으로도 풀이 가능 

 

*실수

1) 거리 배열(DIST)를 최대값으로 초기화 하지 않은 것

Arrays.fill(DIST, Integer.MAX_VALUE)

2) 연결된 간선 조회시 이전에 구한 간선으로 이동하는 비용과 현재 간선의 비용을 비교하지 않은 것 (풀이가 최단거리와 비슷)

 

 

초기 DIST(거리 배열) 선언 후 구함

1 2 3 4
0 21억 21억 21억

 


제출 

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

public class Main {
    
    static StringBuilder sb = new StringBuilder();

    static int N, M, K, X;

    static int[] DIST;

    static List<Integer>[] adj;
    static void input() 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()); // 도로의 개수 (=간선)
        K = Integer.parseInt(st.nextToken()); // 거리 정보
        X = Integer.parseInt(st.nextToken()); // 시작 번호

        DIST = new int[N + 1];

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

        // 단반향 그래프
        for(int i = 1; i <= M; i++) {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());

            adj[from].add(to);
        }

        for(int i = 1; i <= N; i++) {
            Collections.sort(adj[i]);
        }

        br.close();
    }

    static void bfs(int start) {
        Arrays.fill(DIST, Integer.MAX_VALUE);
        
        Queue<Integer> que = new LinkedList<>();
        que.add(start);
        DIST[start] = 0;

        while(!que.isEmpty()) {
            int x = que.poll();

            for(int y : adj[x]) {
                if(DIST[y] <= DIST[x] + 1) continue;

                DIST[y] = DIST[x] + 1;
                que.add(y);
            }
        }
    }


    static void pro() {
        bfs(X);
        boolean find = false;
        for(int i = 1; i <= N; i++) {
            if(DIST[i] == K) {
                find = true;
                sb.append(i).append("\n");
            }
        }

        if(!find) System.out.println(-1);
        else System.out.println(sb);
    }

    public static void main(String[] args) throws Exception {
        input();
        pro();
    }
    
}
반응형