🔍 문제
모든 사람간의 최단거리 구하기
플로이드 워셜 사용해서 푸는건 알았는데 자꾸 답이 안나오는거...
👾 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class P1389 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); //사람 수
int M = Integer.parseInt(st.nextToken()); //관계 수
int[][] FW = new int[N+1][N+1]; //
// 배열 초기화
for(int i = 1; i <= N; i++) {
Arrays.fill(FW[i], 99999999);
FW[i][i] = 0;
}
//가중치 저장
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
FW[a][b] = 1;
FW[b][a] = 1;
}
//플로이드 워셜 점화실 사용한 반복문(최단거리 배열 채우기)
for(int K = 1; K <= N; K++) {
for(int S = 1; S <= N; S++) {
for(int E = 1; E <= N; E++) {
FW[S][E] = Math.min(FW[S][E], FW[S][K] + FW[K][E]);
}
}
}
int result = 1;
int minSum = Integer.MAX_VALUE;
for(int i = 1; i <= N; i++) {
int sum = 0;
for(int j = 1; j <= N; j++) {
sum+=FW[i][j];
}
if(sum < minSum) {
minSum = sum;
result = i;
}
}
System.out.println(result);
}
}
💡 처음 배열 초기화 Integer.MAX_VALUE ➡️ 99,999,999
처음에 배열 초기화할 때 INF값을 Integer.MAX_VALUE값으로 설정했는데 자꾸 배열에 음수 값이 들어가고 답도 이상하게 나옴...
FW[S][K]와 FW[K][E] 둘 중 하나가 Integer.MAX_VALUE인 경우, 이를 더하면 값이 Integer.MAX_VALUE + 1 이상으로 오버플로우가 발생해 음수가 된다.
항상 오버플로우 조심하긔~⭐️⭐️
'[ STUDY ] > CodingTest' 카테고리의 다른 글
백준 30804 : 과일 탕후루 (0) | 2024.12.11 |
---|---|
BFS, DFS 어려워여 (1) | 2024.12.07 |
백준 18111 : 마인 크래프트 (1) | 2024.12.03 |
백준 1927 : 최소 힙 (3) | 2024.11.26 |
백준 1260 : DFS와 BFS(오늘의 교훈 : 문제를 잘 읽자) (2) | 2024.11.25 |