๐Ÿ’ก Algorithm

[Java] ์ตœ๋‹จ๊ฒฝ๋กœ - ๋‹ค์ต์ŠคํŠธ๋ผ (Lv. Gold4)

jcowwk 2025. 2. 13. 10:43

์ตœ๋‹จ๊ฒฝ๋กœ - ๋‹ค์ต์ŠคํŠธ๋ผ (Lv. Gold4)


1. ๋ฌธ์ œ

2. ํ’€์ด


1. ๋ฌธ์ œ

https://www.acmicpc.net/problem/1753

 

2. ํ’€์ด

import java.util.*;
import java.io.*;

class Node {
    int end;
    int weight;
    
    public Node(int end, int weight) {
        this.end = end;
        this.weight = weight;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int V = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(br.readLine());
        
        boolean[] visit = new boolean[V + 1];
        int[] result = new int[V + 1];
        List<Node>[] list = new List[V + 1];

        for (int i = 0; i <= V; i++) {
            list[i] = new ArrayList<>();
            result[i] = Integer.MAX_VALUE;
        }

        for (int i = 0; i < E; i++) {
            st = new StringTokenizer(br.readLine());

            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            list[u].add(new Node(v, w));
        }
        
        PriorityQueue<Node> queue = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);
        result[K] = 0;
        queue.add(new Node(K, 0));
        
        while (!queue.isEmpty()) {
            Node now = queue.poll();
            if (visit[now.end]) continue;
            visit[now.end] = true;
            
            for (Node next : list[now.end]) {
                if (!visit[next.end] && result[now.end] + next.weight < result[next.end]) {
                    result[next.end] = result[now.end] + next.weight;
                    queue.add(new Node(next.end, result[next.end]));
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= V; i++) {
            if (result[i] == Integer.MAX_VALUE) sb.append("INF\n");
            else sb.append(result[i]).append("\n");
        }
        System.out.print(sb);
    }
}

 

- PriorityQueue<Node> queue = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);

์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๋น„๊ตํ•  ๊ธฐ์ค€์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

o1๊ณผ o2๋Š” Node ๊ฐ์ฒด ๋‘ ๊ฐœ์ด๊ณ , ์šฐ์„ ์ˆœ์œ„ ํ๋Š” o1๊ณผ o2๋ฅผ ๋น„๊ตํ•˜์—ฌ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

o1.weight๊ฐ€ o2.weight ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ o1์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

 

- queue.add(new Node(K, 0));

์šฐ์„ ์ˆœ์œ„ ํ์— Node(K, 0)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘์ ์˜ ๊ฐ€์ค‘์น˜๋Š” 0์œผ๋กœ ์„ค์ •๋˜๊ณ  ๊ทธ ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

- if (visit[now.end]) continue;

ํ๊ฐ€ ๋น„์ง€ ์•Š์œผ๋ฉด ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. queue.poll()์„ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค.

visit[now.end]๊ฐ€ true๋ผ๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ด๋ฏ€๋กœ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

for (Node next : list[now.end]) {
    if (!visit[next.end] && result[now.end] + next.weight < result[next.end]) {
        result[next.end] = result[now.end] + next.weight;
        queue.add(new Node(next.end, result[next.end]));
    }
}

 

list[now.end]๋Š” ํ˜„์žฌ now.end ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

Node next๋Š” now.end์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ๊ฐ์˜ ์ธ์ ‘ ๋…ธ๋“œ์™€ ๊ทธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

visit[next.end]๊ฐ€ false์ผ ๊ฒฝ์šฐ์— ์•„์ง ๋ฐฉ๋ฌธ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ !visit[next.end]๋ฅผ ํ•ด์„œ true๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฐฉ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ now.end์—์„œ next.end๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ์˜ ์ด ๋น„์šฉ๊ณผ next.end๊นŒ์ง€ ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฝ๋กœ๋ณด๋‹ค ์งง์œผ๋ฉด ๊ฒฝ๋กœ๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐฑ์‹ ๋œ result[next.add] ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ next.end ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š” !

ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค <3