[์•Œ๊ณ ๋ฆฌ์ฆ˜] *๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ญ˜๊นŒ?

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€

ํ•˜๋‚˜์˜ ์ถœ๋ฐœ์ ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋„์ฐฉ์ ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

๋Œ€์‹  ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ„์„ ๋“ค์˜ ๋น„์šฉ์ด ๋ชจ๋‘ ์–‘์ˆ˜์—ฌ์•ผ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ ์Œ์˜ ๋น„์šฉ์„ ๊ฐ€์ง„ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค. 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฉ”์ธ ์•„์ด๋””์–ด๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ์กด์— ๊ตฌํ•ด๋†“์€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ€๋Š” ๋ฉ”์ธ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค)

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณต์žก๋„ (์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฒƒ)

์›๋ž˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(V^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•œ ๋ฐœ์ „๋œ ์•„์ด๋””์–ด๊ฐ€ ์ œ๊ณต๋˜๋ฉด์„œ O(E * lgV)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ๋‹ค.  (V๋Š” ๋…ธ๋“œ์˜ ์ˆ˜, E๋Š” ๊ฐ„์„ ์˜ ์ˆ˜) 

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋กœ์ง 

1. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ, ์šฐ์„  ์ˆœ์œ„ํ์— ์‚ฝ์ž…ํ•œ๋‹ค. 

   1-1. ์‹œ์ž‘ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋Š” ๋ฌดํ•œ๋Œ€ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. 

2. ์šฐ์„  ์ˆœ์œ„ ํ(Min Heap)์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋น„์šฉ์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

  2-1. ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ๊ฐ€์ ธ์™€ ๋ฐ˜๋ณตํ•œ๋‹ค.

    2-1-1. u๊ฐ€ ์ถœ๋ฐœ ๋…ธ๋“œ v๊ฐ€ ๋ชฉ์ ์ง€๋ผ๊ณ  ํ•  ๋•Œ, ์ตœ๋‹จ ๊ฒฝ๋กœ ๋น„์šฉ[v] = Math.min(์ตœ๋‹จ ๊ฒฝ๋กœ ๋น„์šฉ[v], ์ตœ๋‹จ ๊ฒฝ๋กœ ๋น„์šฉ[u] + ๊ฒฝ๋กœ ๋น„์šฉ[u][v]) (s -> v, s -> u -> v) ์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ

3. 2๋ฒˆ์„ ์šฐ์„  ์ˆœ์œ„ ํ์— ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. 

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

    private void dijkstra(int start) {
        boolean[] check = new boolean[adjArray.length+1];
        PriorityQueue<int[]> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o[1]));

        Arrays.fill(distance, Integer.MAX_VALUE);
        distance[start] = 0;

        queue.add(new int[]{start, 0});
        while(!queue.isEmpty()) {
            int[] u = queue.poll();
            if(distance[u[0]] < u[1]) continue;;
            LinkedList<Integer> connectedNodes = findConnectedNode(u[0]);
            for(int v : connectedNodes) {
                if(distance[v] > distance[u[0]] + adjArray[u[0]][v]) {
                    distance[v] =  distance[u[0]] + adjArray[u[0]][v];
                    queue.add(new int[]{v, distance[v]});
                }
            }
        }
    }

    private LinkedList<Integer> findConnectedNode(int u) {
        LinkedList<Integer> connectedNodes = new LinkedList<>();
        int[] adjLine = adjArray[u];
        for(int i=1; i<adjLine.length; i++) {
            if(adjLine[i] != 0) connectedNodes.add(i);
        }
        return connectedNodes;
    }

 Q1. if(distance[u[0]] < u[1])) continue; ๋Š” ์™œ ํ•˜๋Š”๊ฑธ๊นŒ์š”? 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฉ”์ธ ์•„์ด๋””์–ด๋Š” ๊ธฐ์กด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋กœ์ง์ธ๋ฐ, ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตณ์ด ๊ทธ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ๊ฐฑ์‹ ์„ ์‹œ๋„ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋Š”๊ฒ๋‹ˆ๋‹ค.

Q2. if(distance[v] > distance[u[0]] + adjArray[u[0]][v]) ์—ฌ์•ผ queue์— ๋…ธ๋“œ๋ฅผ ๋„ฃ๋Š”๊ฑด๊ฐ€์š”? 

์œ„์˜ ์งˆ๋ฌธ์˜ ๋Œ€๋‹ต์ฒ˜๋Ÿผ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋กœ์ง์ธ๋ฐ, ๊ฐฑ์‹ ์ด ๋˜์ง€ ์•Š์€ (์ตœ์†Œ๊ฐ€ ์•„๋‹Œ) ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•  ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.