녕의 학습 기록

백준_11657 타임머신 (벨만-포드) 본문

Algorithm/Algorithm 문제

백준_11657 타임머신 (벨만-포드)

kjyyjk 2024. 2. 25. 23:20

 

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

public class BJ_11657_타임머신 {

    static long[] distance;
    static Edge[] edges;

    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());

        distance = new long[n+1];
        edges = new Edge[m];

        int i;
        for (i=1; i<n+1; i++) {
            distance[i] = Integer.MAX_VALUE;
        }

        int u,v,w;
        for (i=0; i<m; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            u = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());

            edges[i] = new Edge(u, v, w);
        }

        distance[1] = 0;

        Edge nowEdge;
        for (i=1; i<n; i++) {
            for (int j=0; j<m; j++) {
                nowEdge = edges[j];

                if (distance[nowEdge.u] != Integer.MAX_VALUE && 
                distance[nowEdge.v] > distance[nowEdge.u] + nowEdge.w) {
                    distance[nowEdge.v] = distance[nowEdge.u] + nowEdge.w;
                }
            }
        }

        boolean cycle = false;
        for (i=0; i<m; i++) {
            nowEdge = edges[i];
            if (distance[nowEdge.u] != Integer.MAX_VALUE && 
            distance[nowEdge.v] > distance[nowEdge.u] + nowEdge.w) {
                cycle = true; //음수 사이클 존재
            }
        }

        StringBuilder sb = new StringBuilder();
        if (cycle) {
            sb.append(-1);
        } else {
            for (i=2; i<n+1; i++) {
                if (distance[i] != Integer.MAX_VALUE) {
                    sb.append(distance[i]).append('\n');
                } else {
                    sb.append(-1).append('\n');
                }
            }
        }

        System.out.println(sb);
    }

    static class Edge {
        int u;
        int v;
        int w;

        public Edge(int u, int v, int w) {
            this.u = u;
            this.v = v;
            this.w = w;
        }
    }
}
 

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