Hard deck/리포트

057 : 최소 비용 구하기

서버관리자 페페 2022. 8. 8. 20:25
(Briefing)
(문제) (단 하나의 맥락) (입출력과 되어야 하는 그림)
N개의 도시
도시 사이의 M개의 버스
특정 구간의 최소 비용 출력
  I // 
도시 수 N
버스 수 M
S도시(1), E도시(1), 버스 비용(1)
...
S도시(M), E도시(M), 버스비용(M)
구간 S도시, 구간 E도시

O //
최소 비용 출력 

 

import org.w3c.dom.Node;

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

public class Main {

    // Argument Supply
    static int N, M;
    static ArrayList<Node>[] list;
    static int[] distance;
    static boolean[] visited;

    public static void main(String[] args) throws Exception {

        // Input Supply Cable
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        M = Integer.parseInt(br.readLine());
        list = new ArrayList[N+1];
        distance = new int[N+1];
        visited = new boolean[N+1];

        // Preprocessing
        Arrays.fill(distance, Integer.MAX_VALUE);
        for (int i = 0; i <= N; i++) {
            list[i] = new ArrayList<Node>();
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int fee = Integer.parseInt(st.nextToken());
            list[start].add(new Node(end, fee));
        }

        st = new StringTokenizer(br.readLine());
        int startIndex = Integer.parseInt(st.nextToken());
        int endIndex = Integer.parseInt(st.nextToken());


        // Operating Dijkstra
        bw.write(dijkstra(startIndex, endIndex) + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

    // External Module Dijkstra
    public static int dijkstra(int start, int end) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.offer(new Node(start, 0));
        distance[start] = 0;
        while (pq.isEmpty()) {
            Node nowNode = pq.poll();
            int now = nowNode.targetNode;
            if (!visited[now]) {
                visited[now] = true;
                for (Node n : list[now]) {
                    if (!visited[n.targetNode] && distance[n.targetNode] > distance[now] + n.value) {
                        distance[n.targetNode] = distance[now] + n.value;
                        pq.add(new Node(n.targetNode, distance[n.targetNode]));
                    }
                }
            }
        }
        return distance[end];
    }
}

// External Class
class Node implements Comparable<Node> {
    int targetNode;
    int value;
    Node(int targetNode, int value) {
        this.targetNode = targetNode;
        this.value = value;
    }
    @Override
    public int compareTo(Node o) {
        return value - o.value;
    }
}

'Hard deck > 리포트' 카테고리의 다른 글

062 : 경로 찾기  (0) 2022.08.08
060 : 세일즈맨의 고민  (0) 2022.08.08
049 : 물의 양 구하기  (0) 2022.08.08
048 : Bipartite graph 판별하기  (0) 2022.08.08
047 : 효율적으로 해킹하기  (2) 2022.08.08