Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_11657] 타임머신 본문

Study/Problem Solving

[BOJ_11657] 타임머신

monitor 2024. 2. 7. 20:03

설명


벨만 포드 알고리즘을 활용했고 dist 거리 부분을 long으로 바꾸지 않으면 오버플로 오류가 났습니다. 이런 작은 부분들을 체크하는 것이 어려웠습니다.

 

코드


package BOJ.shortest_path;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class BOJ_11657 {
    static int N,M;
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");

        N = Integer.parseInt(tk.nextToken());
        M = Integer.parseInt(tk.nextToken());

        List<Edge> edges = new ArrayList<>();

        long[] minDist = new long[N + 1];
        Arrays.fill(minDist, 100_000_000);

        for (int i = 0; i < M; i++){
            tk = new StringTokenizer(in.readLine()," ");

            int from = Integer.parseInt(tk.nextToken());
            int to = Integer.parseInt(tk.nextToken());
            int dist = Integer.parseInt(tk.nextToken());
            edges.add(new Edge(from, to, dist));
        }

        if(bellmanFord(edges, minDist)){
            for (int i = 2; i <= N; i++) {
                if(minDist[i] == 100_000_000){
                    System.out.println("-1");
                }
                else {
                    System.out.println(minDist[i]);
                }
            }
        }
        else {
            System.out.println("-1");
        }
    }

    private static boolean bellmanFord(List<Edge> edges, long[] minDist) {
        boolean check = true;
        minDist[1] = 0;
        for (int i = 0; i < N - 1; i++){
            for (Edge edge : edges){
                if(minDist[edge.from] != 100_000_000 && minDist[edge.to] > minDist[edge.from] + edge.dist){
                    minDist[edge.to] = minDist[edge.from] + edge.dist;
                }
            }
        }
        for (Edge edge : edges){
            if (minDist[edge.from] != 100_000_000 && minDist[edge.to] > minDist[edge.from] + edge.dist){
                check = false;
            }
        }
        return check;
    }

    static class Edge{
        int from;
        int to;
        int dist;
        public Edge(int from, int to, int dist){
            this.from = from;
            this.to = to;
            this.dist = dist;
        }
    }
}

 

 

11657번: 타임머신

첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. 

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_1865] 웜홀  (1) 2024.02.11
[BOJ_22865] 가장 먼 곳  (1) 2024.02.11
[BOJ_10159] 저울  (0) 2024.02.04
[BOJ_2224] 명제증명  (0) 2024.02.02
[BOJ_1227] 발전소 설치  (1) 2024.01.28