알고리즘/백준

14284_간선 이어가기 2 *****

베리영young 2024. 6. 10. 21:42

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

사용 언어: 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) {
        dp[s] = 0; //시작점은 0으로 초기화

        // ** 우선순위 큐를 쓰는 게 중요
        PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> o1.value - o2.value); //가중치 순서대로 정렬
        pq.offer(new Node(s, 0));

        // ** 다익스트라
        while (!pq.isEmpty()) {
            Node cur = pq.poll();

            for (Node nxt : al[cur.node]) {
                if (dp[nxt.node] > dp[cur.node] + nxt.value) {
                    dp[nxt.node] = dp[cur.node] + nxt.value;
                    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;

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

 

 

느낀점:

우선순위 큐를 사용하라 이거야악~!

 

 

'알고리즘 > 백준' 카테고리의 다른 글

14284_간선 이어가기 2 **  (1) 2024.06.11
14503_로봇 청소기  (2) 2024.06.11
24955_숫자 이어 붙이기 ****  (0) 2024.06.10
13549_숨바꼭질3  (1) 2024.06.10
7562_나이트의 이동  (0) 2024.06.10