알고리즘/백준

14284_간선 이어가기 2 **

베리영young 2024. 6. 11. 11:28

사용 알고리즘: 다익스트라

사용 언어: java

 

package src.alStudy02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_bj_14284_간선이어가기2 {
    static int n, m; //정점 개수, 간선 개수
    static ArrayList<Node>[] al; //인접 리스트
    static int s, t; //시작점, 종착점
    static int[] dp; //최솟값 저장

    public static void main(String[] args) throws IOException {
        input_14284();

        System.out.println(dfs_14284(s, t));
    }

    private static int dfs_14284(int s, int t) {
        // 가중치가 작은 -> 큰 순으로 정렬하는 우선순위 큐 사용
        PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> o1.value - o2.value);
        dp[s] = 0; // 시작점은 0으로 초기화
        pq.offer(new Node(s, 0));

        while (!pq.isEmpty()) {
            Node cur = pq.poll();

            // ** 다익스트라
            for (Node nxt : al[cur.node]) {
                if (dp[nxt.node] > nxt.value + dp[cur.node]) {
                    dp[nxt.node] = nxt.value + dp[cur.node];
                    pq.offer(new Node(nxt.node, dp[nxt.node]));
                }
            }
            // ** 혼돈의 카오스

        }

        return dp[t];
    }

    private static void input_14284() 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()); //간선 개수

        dp = new int[n];
        Arrays.fill(dp, Integer.MAX_VALUE);

        al = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            al[i] = new ArrayList<>();
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) -1;
            int b = Integer.parseInt(st.nextToken()) -1;
            int val = Integer.parseInt(st.nextToken());

            //무방향이므로 둘 다 add
            al[a].add(new Node(b, val));
            al[b].add(new Node(a, val));
        }

        st = new StringTokenizer(br.readLine());
        s = Integer.parseInt(st.nextToken()) -1;
        t = Integer.parseInt(st.nextToken()) -1;
    }
}

class Node {
    int node; //정점의 숫자
    int value; //node까지의 가중치

    public Node(int node, int value) {
        this.node = node;
        this.value = value;
    }
}

 

느낀 점:

다익스트라... 익숙치 않다..

다익스트라 ) dp 사용

                     PriorityQueue 사용 (정렬 람다식!!!)

                     찐 다익스트라 헷갈리는 게 많으니까 조심