백준 11657 - 타임머신
Updated:
Java
11657 번 - 타임머신
문제
접근 방법
벨만 포드 알고리즘을 통해 해결하였다.
주의할 점은 각 노드의 비용을 담을 node
의 자료형을 long으로 하여야한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, result;
static int INF = 999999999;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
long[] node = new long[n + 1];
List<List<int[]>> graph = new ArrayList<>();
for(int i = 0; i <= n; i++) {
node[i] = INF;
graph.add(new ArrayList<>());
}
node[1] = 0;
int a,b,c;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
c = stoi(stk.nextToken());
graph.get(a).add(new int[] {b,c});
}
boolean isChanged = false;
// v - 1만큼 반복한다.
for(int i = 1; i <= n; i++) {
// 기준 노드를 하나 씩 정한다.
for(int j = 1; j <= n; j++) {
for(int[] edge : graph.get(j)) {
b = edge[0];
c = edge[1];
// 기준 노드가 무한대이면, 간선을 더하는 것이 의미가 없다.
// 기준 노드에서 다음 노드로 갔을 때 root에서 다음 노드로 간 것보다 싸면.
if(node[j] != INF && node[b] > node[j] + c)
node[b] = node[j] + c;
}
}
// 마지막, 음수 사이클이 존재하는지 확인
if(i == n) {
for(int j = 1; j <= n; j++) {
for(int[] edge : graph.get(j)) {
b = edge[0];
c = edge[1];
// 기준 노드가 무한대이면, 간선을 더하는 것이 의미가 없다.
// 기준 노드에서 다음 노드로 갔을 때 root에서 다음 노드로 간 것보다 싸면.
if(node[j] != INF && node[b] > node[j] + c)
isChanged = true;
}
}
}
}
if(isChanged)
System.out.println(-1);
else {
for(int i = 2; i <= n; i++) {
if(node[i] == INF)
System.out.println(-1);
else
System.out.println(node[i]);
}
}
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}