Algorithm & Data Structures/BOJ

b1956. ์šด๋™

Geisha 2025. 3. 20. 23:00

 

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ยณ) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 



๐ŸŽฏ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์žฅ์ 

 

โœ… ๋ชจ๋“  ์ •์  ๊ฐ„ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ

โœ… ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ์–ด๋„ ์ ์šฉ ๊ฐ€๋Šฅ (์Œ์ˆ˜ ์‚ฌ์ดํด์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ)

โœ… ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์ด๊ณ  ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•จ

 



์ด ๊ธ€์ด ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ข‹์•„์š”์™€ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ˜Š