• 문제 링크
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
• 풀이 과정
• 풀이 코드
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.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n;
static List<Edge>[] list;
static final int inf = 200000000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
list = new ArrayList[n + 1];
for (int i = 1; i <= n; i++)
list[i] = new ArrayList<>();
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine());
int src = Integer.parseInt(st.nextToken());
int dest = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
list[src].add(new Edge(dest, weight));
list[dest].add(new Edge(src, weight));
}
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int path1 = dijkstra(1, v1) + dijkstra(v1, v2) + dijkstra(v2, n);
int path2 = dijkstra(1, v2) + dijkstra(v2, v1) + dijkstra(v1, n);
int res = Math.min(path1, path2);
bw.write(String.valueOf(res >= inf ? -1 : res));
bw.flush();
}
private static int dijkstra(int src, int dest) {
PriorityQueue<Edge> pq = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);
int[] dist = new int[n + 1];
pq.offer(new Edge(src, 0));
Arrays.fill(dist, inf);
dist[src] = 0;
while (!pq.isEmpty()) {
Edge edge = pq.poll();
int cur = edge.node;
for (Edge next : list[cur]) {
if (dist[next.node] > dist[cur] + next.weight) {
dist[next.node] = dist[cur] + next.weight;
pq.offer(next);
}
}
}
return dist[dest];
}
private static class Edge {
int node, weight;
public Edge(int node, int weight) {
this.node = node;
this.weight = weight;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1613 역사 - Graph Theory / Java (0) | 2022.10.30 |
---|---|
[백준] 1956 운동 - Graph Theory / Java (0) | 2022.10.29 |
[백준] 2616 소형기관차 - Dynamic Programming / Java (0) | 2022.10.27 |
[백준] 2281 데스노트 - Dynamic Programming / Java (0) | 2022.10.26 |
[백준] 12996 Acka - Dynamic Programming / Java (0) | 2022.10.25 |
댓글