https://www.acmicpc.net/problem/1956
๐ ์๋ฐ(Java)๋ก ํธ๋ ์ด๋ ๋ฌธ์ - ๋ฐฑ์ค 1956 ๐ดโ๏ธ
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 1956๋ฒ - ์ด๋ ๋ฌธ์ ์ ๋๋ค.
V๊ฐ์ ๋ง์๊ณผ E๊ฐ์ ๋๋ก๊ฐ ์ฃผ์ด์ก์ ๋,
“ํ ๋ง์์์ ์ถ๋ฐํ์ฌ ๋ค์ ๊ทธ ๋ง์๋ก ๋์์ค๋ ์ต์ ์ฌ์ดํด์ ๊ธธ์ด” ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๐ด ์ฆ, ์ต๋จ ์ฌ์ดํด(์ํ ๊ฒฝ๋ก)์ ๊ธธ์ด๋ฅผ ์ฐพ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
๐ก ์์ ์ ๋ ฅ
3 4
1 2 1
3 1 1
2 3 1
1 3 5
๐ก ์์ ์ถ๋ ฅ
3
โก ์ต๋จ ์ฌ์ดํด์ ๊ธธ์ด๊ฐ 3์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ ์ถ๋ ฅ
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ(Floyd-Warshall Algorithm) ์ ์ฌ์ฉํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ
โ ๋ชจ๋ ์ ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํด์ผ ํจ
โ ๊ฐ ์ ์ ์์ ์์ํ์ฌ ๋ค์ ์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ์ต์ ๋น์ฉ์ ์ฐพ์์ผ ํจ
โ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ O(V³) ๋ณต์ก๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
๐น Java ์ฝ๋ ํด์ค
import java.io.*;
import java.util.*;
public class Main {
static int V, E;
static int INF = 40000000; // ์ถฉ๋ถํ ํฐ ๊ฐ ์ค์
static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
V = stringToInt(st.nextToken());
E = stringToInt(st.nextToken());
graph = new int[V + 1][V + 1];
for (int i = 0; i <= V; i++)
Arrays.fill(graph[i], INF);
for (int i = 0; i <= V; i++)
graph[i][i] = 0; // ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ 0
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int a = stringToInt(st.nextToken());
int b = stringToInt(st.nextToken());
int c = stringToInt(st.nextToken());
graph[a][b] = c;
} // ์
๋ ฅ ์ข
๋ฃ
logic();
int answer = INF;
for (int i = 1; i <= V; i++) {
answer = Math.min(answer, graph[i][i]); // ์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ
}
System.out.println((answer == INF) ? -1 : answer);
}
static void logic() { // ํ๋ก์ด๋-์์
์๊ณ ๋ฆฌ์ฆ
for (int k = 1; k <= V; k++) { // ๊ฒฝ์ ์ง
for (int i = 1; i <= V; i++) { // ์ถ๋ฐ์ง
for (int j = 1; j <= V; j++) { // ๋์ฐฉ์ง
if (graph[i][j] > graph[i][k] + graph[k][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
}
static int stringToInt(String s) {
return Integer.parseInt(s);
}
}
๐ ์ฝ๋ ์ค๋ช
๐ 1. ๊ทธ๋ํ ์ ๋ ฅ ๋ฐ ์ด๊ธฐํ
graph = new int[V + 1][V + 1];
for (int i = 0; i <= V; i++)
Arrays.fill(graph[i], INF);
for (int i = 0; i <= V; i++)
graph[i][i] = 0; // ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ 0
โ INF(40000000) ๊ฐ์ผ๋ก ์ด๊ธฐํํ์ฌ ์ต์๊ฐ ๋น๊ต์ ํ์ฉ
โ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ค์
๐ 2. ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ ์ํ
for (int k = 1; k <= V; k++) { // ๊ฒฝ์ ์ง
for (int i = 1; i <= V; i++) { // ์ถ๋ฐ์ง
for (int j = 1; j <= V; j++) { // ๋์ฐฉ์ง
if (graph[i][j] > graph[i][k] + graph[k][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
โ ๋ชจ๋ ์ ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์
โ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด O(V³) ์๊ฐ ์์ ํด๊ฒฐ ๊ฐ๋ฅ
๐ 3. ์ต์ ์ฌ์ดํด ๊ธธ์ด ์ฐพ๊ธฐ
int answer = INF;
for (int i = 1; i <= V; i++) {
answer = Math.min(answer, graph[i][i]); // ์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ
}
System.out.println((answer == INF) ? -1 : answer);
โ ์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ์ต๋จ ๊ฒฝ๋ก ์ค ์ต์๊ฐ์ ์ฐพ์ ์ถ๋ ฅ
โ ์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ -1 ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
โ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐ
โ ์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ์ต๋จ ๊ฒฝ๋ก ์ค ์ต์๊ฐ์ ์ฐพ์ ์ถ๋ ฅ
โ O(V³) ์๊ฐ ๋ณต์ก๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
๐ฏ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฅ์
โ ๋ชจ๋ ์ ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐ ๊ฐ๋ฅ
โ ์์ ๊ฐ์ค์น๊ฐ ์์ด๋ ์ ์ฉ ๊ฐ๋ฅ (์์ ์ฌ์ดํด์ ํ์ฉํ์ง ์์)
โ ์ฝ๋๊ฐ ์ง๊ด์ ์ด๊ณ ๊ตฌํ์ด ๊ฐ๋จํจ
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ๐
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b.3273 ๋ ์์ ํฉ (0) | 2025.04.01 |
---|---|
b.11657 ํ์๋จธ์ (0) | 2025.03.20 |
b.9370 ๋ฏธํ์ธ ๋์ฐฉ์ง (0) | 2025.03.15 |
b.1707 ์ด๋ถ ๊ทธ๋ํ (0) | 2025.03.12 |
b24445. ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 2 (1) | 2025.03.06 |