๐ ๋ฒจ๋ง-ํฌ๋
๋ฒจ๋ง-ํฌ๋(bellman-ford-moore) ์๊ณ ๋ฆฌ์ฆ์ ํน์ ์ถ๋ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ค์ต์คํธ๋ผ์๋ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ค์น ์์ง๊ฐ ์์ด๋ ์ํ ๊ฐ๋ฅํ๋ฉฐ, ์ฃผ๋ก ์ ์ฒด ๊ทธ๋ํ์์ ์์ ์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ฌธ์ ๋ก ๋์จ๋ค.
1. ์์ง ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๊ณ ์ต๋จ ๊ฒฝ๋ก ๋ฐฐ์ด ์ด๊ธฐํ
์ต๋จ ๊ฒฝ๋ก ๋ฐฐ์ด์ ์ถ๋ฐ ๋ ธ๋๋ 0, ๋๋จธ์ง๋ ๋ฌดํ๋๋ก ์ด๊ธฐํํ๋ค. (๊ตฌํํ ๋๋ Integer.MAX_VALUE๋ก ์ด๊ธฐํ)
Edge ํด๋์ค์ ์ถ๋ฐ๋ ธ๋, ๋์ฐฉ๋ ธ๋, ๊ฐ์ค์น๋ฅผ ๋ด๊ณ Edge ํด๋์ค ๋ฆฌ์คํธ ๋๋ ๋ฐฐ์ด์ ๊ตฌํํ๋ค.
2. ๋ชจ๋ ์์ง๋ฅผ ํ์ธํด ์ต๋จ ๊ฒฝ๋ก ๋ฐฐ์ด ์ ๋ฐ์ดํธ, (๋ ธ๋ ๊ฐ์ - 1) ๋ฒ ๋ฐ๋ณต
dist[edge.start] != Integer.MAX_VALUE && dis[edge.end] > dist[edge.start] + edge.value
๐ ํ์๋จธ์ - ๋ฐฑ์ค 11657
https://www.acmicpc.net/problem/11657
๋ฌธ์
N๊ฐ์ ๋์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ ๋ฒ์ค๊ฐ M๊ฐ ์๋ค. ๊ฐ ๋ฒ์ค๋ A, B, C๋ก ๋ํ๋ผ ์ ์๋๋ฐ, A๋ ์์๋์, B๋ ๋์ฐฉ๋์, C๋ ๋ฒ์ค๋ฅผ ํ๊ณ ์ด๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋ค. ์๊ฐ C๊ฐ ์์๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. C = 0์ธ ๊ฒฝ์ฐ๋ ์๊ฐ ์ด๋์ ํ๋ ๊ฒฝ์ฐ, C < 0์ธ ๊ฒฝ์ฐ๋ ํ์๋จธ์ ์ผ๋ก ์๊ฐ์ ๋๋์๊ฐ๋ ๊ฒฝ์ฐ์ด๋ค.
1๋ฒ ๋์์์ ์ถ๋ฐํด์ ๋๋จธ์ง ๋์๋ก ๊ฐ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N (1 ≤ N ≤ 500), ๋ฒ์ค ๋ ธ์ ์ ๊ฐ์ M (1 ≤ M ≤ 6,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ๋ฒ์ค ๋ ธ์ ์ ์ ๋ณด A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๋ง์ฝ 1๋ฒ ๋์์์ ์ถ๋ฐํด ์ด๋ค ๋์๋ก ๊ฐ๋ ๊ณผ์ ์์ ์๊ฐ์ ๋ฌดํํ ์ค๋ ์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ค๋ฉด ์ฒซ์งธ ์ค์ -1์ ์ถ๋ ฅํ๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด N-1๊ฐ ์ค์ ๊ฑธ์ณ ๊ฐ ์ค์ 1๋ฒ ๋์์์ ์ถ๋ฐํด 2๋ฒ ๋์, 3๋ฒ ๋์, ..., N๋ฒ ๋์๋ก ๊ฐ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์์๋๋ก ์ถ๋ ฅํ๋ค. ๋ง์ฝ ํด๋น ๋์๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด ๋์ -1์ ์ถ๋ ฅํ๋ค.
๐ ํต์ฌ ์์ด๋์ด
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
๐ ์ฃผ์ํ ์
distance ๋ฐฐ์ด์ int ๋ฐฐ์ด๋ก ์ ์ธํ๋ฉด ์ถ๋ ฅ์ด๊ณผ๋ก ๋์จ๋ค.
๋ฒจ๋ง ํฌ๋๋ ์ ์ฒด ๊ณผ์ ์ ์์ง์ ์(M)๋งํผ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์, ์์ ์ฌ์ดํด์ ์ ๋๊ฐ์ ์ต๋ ๊ธธ์ด๊ฐ 6์ฒ๋ง(M<=6000, |C|<=10,000)์ด๋ผ๋ฉด ๊ทธ ๊ณผ์ ์ ๋ค์ N๋ฒ ๋ฐ๋ณตํ๋ฉด์ N์ ๊ณฑํ ๊ฒ๋งํผ ์ ๋๊ฐ์ ํค์ฐ๊ฒ ๋๋ค. (N ≤ 500 -> 21์ต int ๋ฒ์ ๋์)
๋ฐ๋ผ์ distance ๋ฐฐ์ด์ long ํ์ ์ผ๋ก ํด์ผ ํ๋ค.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
Edge[] edges = new Edge[M];
for (int i = 0; i < M; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
int w = sc.nextInt();
edges[i] = new Edge(u,v,w);
}
long[] distance = new long[N+1];
for (int i = 0; i <= N; i++) {
distance[i] = Integer.MAX_VALUE;
}
// ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ
distance[1] = 0; // 1๋ฒ ๋์์ ์ถ๋ฐ
for (int i = 1; i < N; i++) { // N-1๋ฒ ์
๋ฐ์ดํธ
for (int j = 0; j < M; j++) { // ๋ชจ๋ ์์ง ํ์ธ
Edge edge = edges[j];
if(distance[edge.start] != Integer.MAX_VALUE){ // "<" ๋ ๋ง์
if(distance[edge.end] > distance[edge.start]+edge.value){
distance[edge.end] = distance[edge.start]+edge.value;
}
}
}
}
// ์์ ์ฌ์ดํด ํ์ธ
boolean isCycle = false;
for (int i = 0; i < M; i++) {
Edge edge = edges[i];
if(distance[edge.start] != Integer.MAX_VALUE){
if(distance[edge.end] > distance[edge.start]+edge.value){
isCycle = true;
}
}
}
if(!isCycle){
for (int i = 2; i <=N; i++) {
if(distance[i] == Integer.MAX_VALUE) // 1๋ฒ์์ ๋๋ฌํ ์ ์๋ ๋
ธ๋
System.out.println(-1);
else
System.out.println(distance[i]);
}
}else{
System.out.println(-1);
}
}
}
class Edge{
int start, end, value;
public Edge(int start, int end, int value) {
this.start = start;
this.end = end;
this.value = value;
}
}
์ฝํ ์ ๋ฆฌ ๊นํ๋ธ ๋งํฌ
GitHub - HyperAlgorithmStudy/BaekJoon: Do it! ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉ ํ ์คํธ ์คํฐ๋
Do it! ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉ ํ ์คํธ ์คํฐ๋. Contribute to HyperAlgorithmStudy/BaekJoon development by creating an account on GitHub.
github.com
์ฐธ๊ณ : Do it! ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉ ํ ์คํธ: ์๋ฐ ํธ - ๊น์ข ๊ด
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ์ฌ์ - ๋ฐฑ์ค 1256 (์๋ฐ JAVA) - ์กฐํฉ (0) | 2023.01.16 |
---|---|
[BOJ] ํ๋ก์ด๋ - ๋ฐฑ์ค 11404, 1389 (์๋ฐ JAVA) - ํ๋ก์ด๋-์์ (0) | 2023.01.10 |
[BOJ] ๊ฒ์ ๊ฐ๋ฐ - ๋ฐฑ์ค 1516 (JAVA) - ์์ ์ ๋ ฌ (0) | 2023.01.07 |
[BOJ] ์ฌํ ๊ฐ์ - ๋ฐฑ์ค 1976 (JAVA) - ์ ๋์จ ํ์ธ๋ (0) | 2023.01.06 |
[BOJ] ์ต์๊ณต๋ฐฐ์ - ๋ฐฑ์ค 1934 (JAVA) - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.01.05 |
๋๊ธ