반응형
SMALL
문제
https://www.acmicpc.net/problem/1916
문제풀이
일반적인 다익스트라 문제이다. 오랜만에 풀어보니 어려움이 있었다.. 그래서 손으로 적어가면서 풀었는데 좀 많이 틀렸다... 내가 틀린 이유는 아래와 같은 부분을 고려하지 못하여서 틀렸다.
1. 출발지점과 끝지점이 같은 버스가 여러 대 올 수 있다. (이때는 최소값으로 갱신 또는 유지)
2. Integer.MAX_VALUE 를 사용하여 풀려고 했는데 Overflow 문제가 있었다.
3. 버스의 번호는 1~N 까지 이므로 초기화 해줄 때 또는 for문 돌 때 주의해야한다.
소스코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int N, M, MAX = 987_654_321;
public static int[][] map;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
map = new int[N+1][N+1];
for(int i = 0; i <= N; i++) Arrays.fill(map[i], -1);
for(int i = 0; i < M; i++) {
String[] arguments = br.readLine().split(" ");
int s = Integer.parseInt(arguments[0]);
int e = Integer.parseInt(arguments[1]);
int v = Integer.parseInt(arguments[2]);
if(map[s][e] != -1) map[s][e] = Math.min(map[s][e], v);
else map[s][e] = v;
}
String[] arguments = br.readLine().split(" ");
int s = Integer.parseInt(arguments[0]);
int e = Integer.parseInt(arguments[1]);
boolean[] visited = new boolean[N+1];
int[] dist = new int[N+1];
// 초기화
for(int i = 1; i <= N; i++) {
dist[i] = map[s][i];
if(dist[i] == -1) dist[i] = MAX;
if(i == s) dist[i] = 0;
}
visited[s] = true;
// 다익스트라
while(true) {
// 최소 비용 구하기
int value = MAX;
int idx = -1;
for(int i = 1; i <= N; i++) {
if(visited[i] || dist[i] > value) continue;
value = dist[i];
idx = i;
}
// 조건에 맞는게 없으면 while 종료
if(value == MAX) break;
visited[idx] = true;
for(int i = 1; i <= N; i++) {
if(visited[i] || map[idx][i] == -1) continue;
dist[i] = Math.min(dist[i], dist[idx] + map[idx][i]);
}
}
System.out.println(dist[e]);
}
}
반응형
LIST
'문제풀이 > 백준' 카테고리의 다른 글
[백준] 18808번: 스티커 붙이기 (Java/자바) (0) | 2024.08.07 |
---|---|
⭐ [백준] 7569번: 토마토 (Java/자바) (2) | 2024.08.01 |
[백준] 14888번: 연산자 끼워넣기 (Java/자바) (0) | 2024.07.28 |
[백준] 11726번: 2xn 타일링 (Java/자바) (0) | 2024.07.28 |
⭐ [백준] 11053번: 가장 긴 증가하는 부분 수열 (Java/자바) (0) | 2024.07.24 |
댓글