1. ๋ฌธ์ ์ค๋ช ๐
๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถํ๊ณ ํ ๋ฒ ์จ๋ณด๋ผ๋ ๊ฒฌ๋ณธ ๋ฌธ์
์ด๋ค.
์ฃผ์ด์ง๋ ๊ฐ์ ์ ๋ณด๋ ๋ชจ๋ ๋จ๋ฐฉํฅ
์ด๋ค.
2. ๊ตฌํ ๋ฐฉ๋ฒ ๐๏ธ
KEY WORD
: BELLMAN-FORD ALGORITHM
- 0๏ธโฃ <์ถ๋ฐ์ง, ๋์ฐฉ์ง, ๊ฐ์ ๊ฐ์ค์น> ํํ๋ก ๋ชจ๋ ๊ฐ์ ์ ์ ์ฅ, ์ต์ ๋น์ฉ ๋ฐฐ์ด์ธ dist [] ์ ์ธ.
(N
: ์ ์ ์ ์,M
: ๊ฐ์ ์ ์, dist ๋ฐฐ์ด์ Long.MAX_VALUE๋ก ์ด๊ธฐํ) - 1๏ธโฃ ์ถ๋ฐ์ง๋ฅผ 1๋ก ์ค์ ํ๊ณ ,
N-1
๋งํผ ๋ชจ๋ ๊ฐ์ ์ ๋๋ฉด์ ๋ค์ ๊ตฌ๋ฌธ์ ์คํํ๋ค.- 1๏ธโฃ-1) ํ์ฌ ์กฐํ์ค์ธ ๊ฐ์ ์ ์ถ๋ฐ์ง๋ฅผ
A
, ๋์ฐฉ์ง๋ฅผB
, AโB์ ๊ฐ์ค์น๋ฅผC
๋ผ๊ณ ํ ๋,dist[A] != ∞๏ธ๏ธ && dist[B] > dist[A] + C
์ด๋ฉด,dist[B]
=dist[A] + C
๋ก ์ต์ ํ ํด์ค๋ค.
- 1๏ธโฃ-1) ํ์ฌ ์กฐํ์ค์ธ ๊ฐ์ ์ ์ถ๋ฐ์ง๋ฅผ
- 2๏ธโฃ ์ ๊ณผ์ ์ ๋๋ธ ํ, ๋ฒจ๋ง ํฌ๋ ๋ด์ ์์ ์ฌ์ดํด์ด ์๋์ง ํ์ธํ๋ค. (์์ ์ฌ์ดํด์ด ์์ผ๋ฉด ๋ฒจ๋ง ํฌ๋ ๋ฌด์์ฉ)
1ํ 1๏ธโฃ-1)์ ํ ๋ฒ ๋ฐ๋ณตํ๋ค. ๋ง์ฝ ์ดํ, dist[]์ ๊ฐ์ด ํ๋๋ผ๋ ๋ฐ๋์๋ค๋ฉด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค.
(๋ง์ฝ ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด,-1
์ถ๋ ฅ ํ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.) - 3๏ธโฃ๋ชจ๋ dist ๋ฐฐ์ด์ ์์๋ฅผ ํ ์ค์ฉ ์ถ๋ ฅํ๋ค. (์์ง Long.MAX_VALUE์ธ ๊ฒฝ์ฐ, ์ถ๋ฐ์ ์์ ๋ฟ์ ์ ์๋ ์ ์ ์ด๋ ๋ป ์ด๋ฏ๋ก,
-1
๋ก ๋ณํํด ์ถ๋ ฅํ๋ค.)
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
- ๊ฐ์ ๋ฆฌ์คํธ ์ด๊ธฐํ : $O(M)$
- ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ $O(NM)$
- ์ถ๋ ฅ: $O(M)$
๊ฒฐ๋ก
: $O(NM)$
3. ์ฝ๋ ์๊ฐ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static StringBuilder ans = new StringBuilder();
static int N, M;
static int [] a, b;
static long [ ] c, dist;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
dist = new long [N + 1];
Arrays.fill(dist, Long.MAX_VALUE);
dist[1] = 0;
a = new int [M]; b = new int [M]; c = new long [M];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
long weight = Long.parseLong(st.nextToken());
a[i] = start; b[i] = end; c[i] = weight;
}
for (int i = 1; i <= N; i++) {
for (int j = 0; j < M; j++) {
int start = a[j];
int end = b[j];
long weight = c[j];
if(dist[start] != Long.MAX_VALUE){
dist[end] = Math.min(dist[end], dist[start] + weight);
}
}
}
for (int i = 0; i < M; i++) {
int start = a[i];
int end = b[i];
long weight = c[i];
long oldValue = dist[end];
if(dist[start] != Long.MAX_VALUE){
dist[end] = Math.min(dist[end], dist[start] + weight);
}
if(oldValue != dist[end]){
System.out.println(-1);
return;
}
}
if (N == 1) {
System.out.println(dist[1]);
return;
}
for (int i = 2; i <= N; i++) {
ans.append(dist[i] == Long.MAX_VALUE? -1 : dist[i]).append("\n");
}
System.out.println(ans);
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
(1) ์ถ๋ ฅ ์ด๊ณผ๊ฐ ๋ฌ๋ ์ด์
์ฒ์์ dist ๋ฐฐ์ด์ int ํํ๋ก ๋๊ณ Integer.MAX_VALUE๋ก ๊ณ์ฐํ๋๋ ์ถ๋ ฅ ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๋ชจ๋ ๊ฐ์ ์ด -10,000
์ด๊ณ ์ ์ ์ ๊ฐ์๊ฐ 50
๊ฐ , ๋
ธ์ ์ ๊ฐ์๊ฐ 6000
๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ต์
์ ๊ฒฝ์ฐ, dist ๋ฐฐ์ด์ ์์๋ก -30์ต์ด ๋ค์ด๊ฐ ์ ์๋ค. ์ด๊ฒ์ ์ธ๋ํ๋ก์ฐ๋ฅผ ์ผ์ผ์ผ ์ถ๋ ฅ ์ด๊ณผ๋ฅผ ์ผ๊ธฐํ๋ค.
0