[BOJ] 1504. 특정한최단경로

정은영·2022년 10월 25일
0

Algorithm

목록 보기
2/7

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


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_1504_특정한최단경로 {
    static class Node implements Comparable<Node> {
        int v;
        int w;

        Node(int v, int w) {
            this.v = v;
            this.w = w;
        }

        @Override
        public int compareTo(Node o) {
            return this.w - o.w;
        }

    }

    static ArrayList<Node>[] nodeList;
    static int[] dist;
    static int N, E;
    static final int INF = 200000000;

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        st = new StringTokenizer(in.readLine());

        N = Integer.parseInt(st.nextToken());
        E = Integer.parseInt(st.nextToken());

        nodeList = new ArrayList[N + 1];
        dist = new int[N + 1];

        for (int i = 1; i <= N; i++) {
            nodeList[i] = new ArrayList<>();
        }

        for (int i = 0; i < E; i++) {
            st = new StringTokenizer(in.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            nodeList[a].add(new Node(b, c));
            nodeList[b].add(new Node(a, c));
        }

        st = new StringTokenizer(in.readLine());
        int v1 = Integer.parseInt(st.nextToken());
        int v2 = Integer.parseInt(st.nextToken());

        int res1 = 0;
        res1 += dijkstra(1, v1);
        res1 += dijkstra(v1, v2);
        res1 += dijkstra(v2, N);

        int res2 = 0;
        res2 += dijkstra(1, v2);
        res2 += dijkstra(v2, v1);
        res2 += dijkstra(v1, N);

        int ans = (res1 >= INF && res2 >= INF) ? -1 : Math.min(res1, res2);

        sb.append(ans);
        out.write(sb.toString());
        out.flush();
        out.close();
    }

    private static int dijkstra(int start, int end) {
        Arrays.fill(dist, INF); // cost 배열 INF로 초기화
        Queue<Node> q = new PriorityQueue<>();
        q.add(new Node(start, 0));
        dist[start] = 0;

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

            if (dist[cur.v] != cur.w)
                continue;
            for (Node node : nodeList[cur.v]) {
                if (dist[node.v] <= dist[cur.v] + node.w)
                    continue;
                dist[node.v] = dist[cur.v] + node.w;
                q.add(new Node(node.v, dist[node.v]));
            }
        }

        return dist[end];
    }
}

배운 점

  • dist 배열을 Integer.MaxValue로 초기화해주게되면 오버플로우가 발생한다.
  • 따라서 INF를 간선의 최대 개수 200,000 * 가중치의 최댓값 1,000 = 200,000,000으로 지정하여 이 값으로 초기화해주어야 한다.

0개의 댓글

관련 채용 정보