b.11657 ํƒ€์ž„๋จธ์‹ 

2025. 3. 20. 23:07ยทAlgorithm & Data Structures/BOJ

 

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
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b.2075 N๋ฒˆ์งธ ํฐ ์ˆ˜
  • b.3273 ๋‘ ์ˆ˜์˜ ํ•ฉ
  • b1956. ์šด๋™
  • b.9370 ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (316)
      • Algorithm & Data Structures (238)
        • BOJ (96)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํ›„์œ„์ˆœํšŒ
    Java
    ๋™์ ๊ณ„ํš๋ฒ•
    ๊ณจ๋“œ
    ๋‹ค์ต์ŠคํŠธ๋ผ
    SQL
    PriorityQueue
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    DynamicProgramming
    ๊ฒฝ๋กœ์••์ถ•
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Union-Find
    Dijkstra
    ๋ฐฑ์ค€
    unionfind
    algorithm
    programmers
    BFS
    dfs
    ์Šคํƒ
    ํˆฌํฌ์ธํ„ฐ
    ์ „์œ„์ˆœํšŒ
    baekjoon
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    Stack
    ์ด๋ถ„ํƒ์ƒ‰
    binarySearch
    ๋ฐฑํŠธ๋ž˜ํ‚น
    dp
    ๊ตฌํ˜„
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b.11657 ํƒ€์ž„๋จธ์‹ 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”