https://www.acmicpc.net/problem/11657
๐ ์๋ฐ(Java)๋ก ํธ๋ ํ์๋จธ์ ๋ฌธ์ - ๋ฐฑ์ค 11657 โณ
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 11657๋ฒ - ํ์๋จธ์ ๋ฌธ์ ์ ๋๋ค.
N๊ฐ์ ๋์์ M๊ฐ์ ๋ฒ์ค ๋ ธ์ ์ด ์ฃผ์ด์ง ๋,
“1๋ฒ ๋์์์ ๋ค๋ฅธ ๋ชจ๋ ๋์๋ก ๊ฐ๋ ์ต๋จ ์๊ฐ” ์ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๐ฐ ๋จ, ์์ ๊ฐ์ค์น(์๊ฐ์ด ๊ฐ์ํ๋ ๊ฒฝ์ฐ)๋ ์กด์ฌํ ์ ์์ผ๋ฉฐ, ์์ ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ๋ณํด์ผ ํฉ๋๋ค.
๐ก ์์ ์ ๋ ฅ
3 4
1 2 4
1 3 3
2 3 -2
3 1 -1
๐ก ์์ ์ถ๋ ฅ
4
3
-1
โก 1๋ฒ ๋์์์ ๊ฐ๊ฐ 2๋ฒ, 3๋ฒ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ (๋๋ฌ ๋ถ๊ฐ๋ฅ ์ -1)
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(Bellman-Ford Algorithm) ์ ์ฌ์ฉํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ
โ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ ์ด์ → ์์ ๊ฐ์ค์น๊ฐ ์กด์ฌ
โ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก ๊ณ์ฐ (O(NM))
โ N-1๋ฒ ๋ฐ๋ณตํ์ฌ ๋ชจ๋ ๋ ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์
โ N๋ฒ์งธ์๋ ๊ฐ์ด ๊ฐฑ์ ๋๋ฉด, ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒ
๐น Java ์ฝ๋ ํด์ค
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class b11657 {
static class Node {
int start, end, time;
public Node(int start, int end, int time) {
this.start = start;
this.end = end;
this.time = time;
}
}
static int N, M;
static ArrayList<Node> edges;
static long[] dist; // long ํ์
์ฌ์ฉ (์ค๋ฒํ๋ก์ฐ ๋ฐฉ์ง)
static final long INF = Long.MAX_VALUE;
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());
edges = new ArrayList<>();
dist = new long[N + 1];
Arrays.fill(dist, INF);
dist[1] = 0; // ์์์ ๊ฑฐ๋ฆฌ 0
// ๊ฐ์ ์ ๋ณด ์
๋ ฅ
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.add(new Node(a, b, c));
}
// ๋ฒจ๋ง-ํฌ๋ ์ํ
if (bellmanFord()) {
System.out.println("-1"); // ์์ ์ฌ์ดํด ์กด์ฌ ์ -1 ์ถ๋ ฅ
} else {
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= N; i++) { // 1๋ฒ ๋์ ์ ์ธ ์ถ๋ ฅ
if (dist[i] == INF) {
sb.append("-1\n"); // ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ -1 ์ถ๋ ฅ
} else {
sb.append(dist[i]).append("\n");
}
}
System.out.println(sb);
}
}
private static boolean bellmanFord() {
boolean hasCycle = false;
// N-1๋ฒ ๋ฐ๋ณต (์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐฑ์ )
for (int i = 1; i < N; i++) {
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
dist[edge.end] = dist[edge.start] + edge.time;
}
}
}
// ์์ ์ฌ์ดํด ์ฒดํฌ (N๋ฒ์งธ ๊ฐฑ์ ์ ๊ฐ์ด ๋ณํ๋ฉด ์ฌ์ดํด ์กด์ฌ)
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
hasCycle = true;
break;
}
}
return hasCycle;
}
}
๐ ์ฝ๋ ์ค๋ช
๐ 1. ๊ทธ๋ํ ์ ๋ ฅ ๋ฐ ์ด๊ธฐํ
edges = new ArrayList<>();
dist = new long[N + 1];
Arrays.fill(dist, INF);
dist[1] = 0; // ์์์ ๊ฑฐ๋ฆฌ 0
โ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(dist[])์ INF๋ก ์ด๊ธฐํ
โ 1๋ฒ ๋์์์ ์ถ๋ฐํ๋ฏ๋ก dist[1] = 0 ์ค์
๐ 2. ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ํ
for (int i = 1; i < N; i++) { // N-1๋ฒ ๋ฐ๋ณต
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
dist[edge.end] = dist[edge.start] + edge.time;
}
}
}
โ ๋ชจ๋ ๊ฐ์ ์ ํ์ธํ๋ฉฐ N-1๋ฒ ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐฑ์
โ ํ์ฌ ๊ฐ์ ์ ํตํด ๋ ์งง์ ๊ฑฐ๋ฆฌ๊ฐ ์กด์ฌํ๋ฉด ๊ฐฑ์
๐ 3. ์์ ์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ ๊ฒ์ฌ
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
hasCycle = true;
break;
}
}
โ N๋ฒ์งธ ๋ฐ๋ณต์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์์ ์ฌ์ดํด์ด ์กด์ฌํจ
โ ์ฆ, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ ๊ฐฑ์ ํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์
๐ 4. ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= N; i++) {
if (dist[i] == INF) {
sb.append("-1\n"); // ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ
} else {
sb.append(dist[i]).append("\n");
}
}
System.out.println(sb);
โ 1๋ฒ ๋์์์ 2~N๋ฒ ๋์๋ก์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
โ ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ -1 ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
โ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก ๊ณ์ฐ
โ ์์ ๊ฐ์ค์น๊ฐ ์กด์ฌํ ์ ์์ผ๋ฏ๋ก ๋ค์ต์คํธ๋ผ๊ฐ ์๋ ๋ฒจ๋ง-ํฌ๋ ํ์ฉ
โ N๋ฒ์งธ ๋ฐ๋ณต์์๋ ๊ฐ์ด ๊ฐฑ์ ๋๋ฉด ์์ ์ฌ์ดํด ์กด์ฌ ํ๋ณ ๊ฐ๋ฅ
๐ฏ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฅ์
โ ์์ ๊ฐ์ค์น๊ฐ ์๋ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ
โ ์์ ์ฌ์ดํด ํ๋ณ์ด ๊ฐ๋ฅํ์ฌ ๋ฌดํ ๊ฐ์ํ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง
โ O(NM) ๋ณต์ก๋๋ก ํด๊ฒฐ ๊ฐ๋ฅํ์ฌ ํฌ๊ธฐ๊ฐ ์์ ๋ ์ ์ฉ
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ๐
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b.2075 N๋ฒ์งธ ํฐ ์ (0) | 2025.04.04 |
---|---|
b.3273 ๋ ์์ ํฉ (0) | 2025.04.01 |
b1956. ์ด๋ (0) | 2025.03.20 |
b.9370 ๋ฏธํ์ธ ๋์ฐฉ์ง (0) | 2025.03.15 |
b.1707 ์ด๋ถ ๊ทธ๋ํ (0) | 2025.03.12 |