https://www.acmicpc.net/problem/1916
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.HashMap;
import java.util.PriorityQueue;
public class Main {
HashMap<Integer, ArrayList<Edge>> map;
public HashMap<Integer, Integer> dijkstra(int start) {
HashMap<Integer, Integer> distances = new HashMap<Integer, Integer>();
PriorityQueue<Edge> pQueue = new PriorityQueue<Edge>();
for(int key : map.keySet()) {
distances.put(key, Integer.MAX_VALUE);
}
distances.put(start, 0);
pQueue.add(new Edge(start, distances.get(start)));
while(!pQueue.isEmpty()) {
Edge cur_node = pQueue.poll();
int cur_vertex = cur_node.vertex;
int cur_distance = cur_node.distance;
if(distances.get(cur_vertex) < cur_distance) {
continue;
}
ArrayList<Edge> nodeList = map.get(cur_vertex);
for(int i = 0; i < nodeList.size(); i++) {
Edge adjacentNode = nodeList.get(i);
int adjacent = adjacentNode.vertex;
int weight = adjacentNode.distance;
int distance = weight + cur_distance;
if(distance < distances.get(adjacent)) {
distances.put(adjacent, distance);
pQueue.add(new Edge(adjacent, distance));
}
}
}
return distances;
}
public void makeMap(int city_num, int[] starts, int[] ends, int[] weights) {
map = new HashMap<>();
for(int i = 1; i <= city_num; i++) {
map.put(i, new ArrayList<Edge>());
}
for(int i = 0; i < starts.length; i++) {
ArrayList<Edge> list = map.get(starts[i]);
list.add(new Edge(ends[i], weights[i]));
map.put(starts[i], list);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int city_num = Integer.parseInt(br.readLine());
int bus_num = Integer.parseInt(br.readLine());
int[] starts = new int[bus_num];
int[] ends = new int[bus_num];
int[] weights = new int[bus_num];
String[] input;
for(int i = 0; i < bus_num; i++) {
input = br.readLine().split(" ");
starts[i] = Integer.parseInt(input[0]);
ends[i] = Integer.parseInt(input[1]);
weights[i] = Integer.parseInt(input[2]);
}
input = br.readLine().split(" ");
int start = Integer.parseInt(input[0]);
int end = Integer.parseInt(input[1]);
br.close();
Main m = new Main();
m.makeMap(city_num, starts, ends, weights);
HashMap<Integer, Integer> distances = m.dijkstra(start);
bw.write(distances.get(end) + "\n");
bw.flush();
bw.close();
}
public static class Edge implements Comparable<Edge> {
int vertex;
int distance;
public Edge(int vertex, int distance) {
this.vertex = vertex;
this.distance = distance;
}
@Override
public int compareTo(Edge e) {
// TODO Auto-generated method stub
return this.distance - e.distance;
}
}
}