Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 다형성
- 캡슐화
- 열거형
- 생성자
- 와일드카드
- Final
- 백준
- 17472
- 인터페이스
- 버퍼비우기
- 추상 클래스
- 추상화
- polymorphism
- enum
- 객체지향
- nextInt
- python
- abstract
- 제네릭
- 내부 클래스
- 프림알고리즘
- 객체 지향
- 최소신장트리
- this
- Scanner
- java
- inheritance
- Encapsulation
- 상속
Archives
- Today
- Total
쫑쫑이의 블로그
백준 1504 특정한 최단 경로 Java [다익스트라] 본문
https://www.acmicpc.net/problem/1504
다익스트라로 1 -> v1 -> v2 -> N 과 1 -> v2 -> v1 -> N 중 가능한 짧은 경로를 찾아 출력하면 된다
import java.io.*;
import java.util.*;
public class Main {
static int N;
static List<int[]>[] nodes;
static final int INF = 700_000_000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
nodes = new List[N+1];
for (int n = 1; n <= N; n++) {
nodes[n] = new ArrayList<>();
}
for (int e = 0; e < E; e++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
nodes[a].add(new int[]{b, c});
nodes[b].add(new int[]{a, c});
}
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int sum = dijkstra(v1, v2) + Math.min(dijkstra(1, v1) + dijkstra(v2, N),
dijkstra(1, v2) + dijkstra(v1, N));
int result = sum >= INF ? -1 : sum;
System.out.println(result);
}
static int dijkstra(int start, int end) {
PriorityQueue<int[]> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o[1]));
boolean[] vtd = new boolean[N+1];
int[] dist = new int[N+1];
Arrays.fill(dist, INF);
dist[start] = 0;
queue.add(new int[]{start, 0});
while (!queue.isEmpty()) {
int[] now = queue.poll();
if (now[0] == end) return dist[end];
if (vtd[now[0]]) continue;
vtd[now[0]] = true;
for (int[] v : nodes[now[0]]) {
if (dist[v[0]] > now[1] + v[1]) {
dist[v[0]] = now[1] + v[1];
queue.add(new int[]{v[0], dist[v[0]]});
}
}
}
return INF;
}
}
INF 8억으로해서 sum이 int 범위 넘어 가는 것을 못 찾아 몇번을 틀린건지 모르겠다
엣지 케이스인 점 2개 있고 간선 없는 경우 sum > INF로해서 틀렸다
'알고리즘 > 백준' 카테고리의 다른 글
백준 12015 가장 긴 증가하는 부분 수열 2 Java [LIS] (0) | 2022.10.22 |
---|---|
백준 1644 소수의 연속합 Java [에라토스테네스의 체] (0) | 2022.10.22 |
백준 1916 최소비용 구하기 Java [다익스트라] (0) | 2022.10.20 |
백준 11660 구간 합 구하기 5 Java [DP, 누적합] (0) | 2022.10.19 |
백준 5639 이진 검색 트리 Java [트리 순회] (0) | 2022.10.10 |