Skip to content

Commit fb8d1e9

Browse files
committed
[Gold IV] Title: 타임머신, Time: 284 ms, Memory: 26676 KB -BaekjoonHub
1 parent 6b61b28 commit fb8d1e9

2 files changed

Lines changed: 114 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold IV] 타임머신 - 11657
2+
3+
[문제 링크](https://www.acmicpc.net/problem/11657)
4+
5+
### 성능 요약
6+
7+
메모리: 26676 KB, 시간: 284 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최단 경로, 벨만–포드
12+
13+
### 제출 일자
14+
15+
2025년 7월 2일 17:21:59
16+
17+
### 문제 설명
18+
19+
<p>N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 버스가 M개 있다. 각 버스는 A, B, C로 나타낼 수 있는데, A는 시작도시, B는 도착도시, C는 버스를 타고 이동하는데 걸리는 시간이다. 시간 C가 양수가 아닌 경우가 있다. C = 0인 경우는 순간 이동을 하는 경우, C < 0인 경우는 타임머신으로 시간을 되돌아가는 경우이다.</p>
20+
21+
<p>1번 도시에서 출발해서 나머지 도시로 가는 가장 빠른 시간을 구하는 프로그램을 작성하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. </p>
26+
27+
### 출력
28+
29+
<p>만약 1번 도시에서 출발해 어떤 도시로 가는 과정에서 시간을 무한히 오래 전으로 되돌릴 수 있다면 첫째 줄에 -1을 출력한다. 그렇지 않다면 N-1개 줄에 걸쳐 각 줄에 1번 도시에서 출발해 2번 도시, 3번 도시, ..., N번 도시로 가는 가장 빠른 시간을 순서대로 출력한다. 만약 해당 도시로 가는 경로가 없다면 대신 -1을 출력한다.</p>
30+
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.StringTokenizer;
7+
8+
class Main {
9+
10+
static int N, M;
11+
static ArrayList<long[]> A[];
12+
static long INF = 1_000_000_000L;
13+
14+
public static void main(String[] args) throws IOException {
15+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
StringTokenizer st = new StringTokenizer(br.readLine());
17+
18+
N = Integer.parseInt(st.nextToken());
19+
M = Integer.parseInt(st.nextToken());
20+
21+
A = new ArrayList[N + 1];
22+
for (int i = 1; i <= N; i++) {
23+
A[i] = new ArrayList<>();
24+
}
25+
for (int i = 0; i < M; i++) {
26+
st = new StringTokenizer(br.readLine());
27+
int u = Integer.parseInt(st.nextToken());
28+
int v = Integer.parseInt(st.nextToken());
29+
long w = Long.parseLong(st.nextToken());
30+
A[u].add(new long[]{v, w});
31+
}
32+
33+
long[] dist = ford(1);
34+
35+
if (dist == null) {
36+
System.out.println("-1");
37+
} else {
38+
for (int i = 2; i <= N; i++) {
39+
if (dist[i] == INF) {
40+
System.out.println("-1");
41+
} else {
42+
System.out.println(dist[i]);
43+
}
44+
}
45+
}
46+
}
47+
48+
static long[] ford(int start) {
49+
long[] dist = new long[N + 1];
50+
Arrays.fill(dist, INF);
51+
dist[start] = 0;
52+
53+
// 최대 N-1번 릴랙스 수행
54+
for (int i = 1; i < N; i++) {
55+
boolean updated = false;
56+
for (int u = 1; u <= N; u++) {
57+
if (dist[u] == INF) continue;
58+
for (long[] edge : A[u]) {
59+
int v = (int)edge[0];
60+
long w = edge[1];
61+
if (dist[u] + w < dist[v]) {
62+
dist[v] = dist[u] + w;
63+
updated = true;
64+
}
65+
}
66+
}
67+
if (!updated) break; // 더 이상 업데이트가 없으면 조기 종료
68+
}
69+
70+
// 음수 사이클 검사
71+
for (int u = 1; u <= N; u++) {
72+
if (dist[u] == INF) continue;
73+
for (long[] edge : A[u]) {
74+
int v = (int)edge[0];
75+
long w = edge[1];
76+
if (dist[u] + w < dist[v]) {
77+
return null; // 음수 사이클 존재
78+
}
79+
}
80+
}
81+
82+
return dist;
83+
}
84+
}

0 commit comments

Comments
 (0)