문제 - https://www.acmicpc.net/problem/11657
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
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static long[] dist;
static final int MAX = Integer.MAX_VALUE;
static class Edge{
int from, to, cost;
public Edge(int from, int to, int cost){
this.from = from;
this.to = to;
this.cost = cost;
}
}static Edge[] edges;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
dist = new long[N+1];
edges = new Edge[M];
for (int i = 2; i <= N; i++)
dist[i] = MAX;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
edges[i] = new Edge(a, b, c);
}
for (int i = 0; i < N-1; i++)
for (Edge E : edges)
if(dist[E.from]<MAX)
dist[E.to] = Math.min(dist[E.to], dist[E.from]+E.cost);
if (!isCycle())
for (int i = 2; i <= N; i++)
if (dist[i]<MAX)
bw.write(dist[i]+"\n");
else
bw.write("-1\n");
else
bw.write("-1\n");
bw.flush();
bw.close();
br.close();
}
static boolean isCycle(){
for (Edge E : edges)
if(dist[E.from]!=MAX && dist[E.from]+E.cost < dist[E.to])
return true;
return false;
}
}
기초 Bellman-Ford 알고리즘이다. 그런데 출력초과로 한참을 벙쪄있었다.
-10,000인 음의 간선이 존재할때, 최대 반복수가 500*6,000이므로 3,000,000*-10,000 이므로 -30,000,000,000이 되어 long타입이 아닌 int타입으로 dist배열을 선언하면 언더플로우가 발생한다.
오버플로우 말고 언더플로우는 처음겪어본다.
아무쪼록 Python을 제외한 언어에서는 문제조건을 보고 자료형에 조금 더 신경써야겠다.
'공부 > algorithm' 카테고리의 다른 글
BOJ 단절선(11400) - Java (0) | 2021.08.10 |
---|---|
BOJ 플로이드(11404) - Java (0) | 2021.08.10 |
BOJ 최단경로(1753) - Java (0) | 2021.08.09 |
BOJ 단절점(11266) - Java (0) | 2021.08.09 |
BOJ 도로 네트워크(3176) - Java (0) | 2021.08.06 |