728x90
📌오늘의 학습 키워드
- 문제에서 나 플루이드 워셜 이에요~~ 라고 티를 내고 있다.
- 하지만 특이한 게 있다면 첫번째로 들러야 하는 지점을 저장해야한다는 것!
✨공부한 내용 본인의 언어로 정리하기
- 단순히 "이동 가능한 가장 짧은 거리를 구하시오" 했으면 쉬웠을 것이다.
- 첫번째로 들러야 하는 지점을 찾기 위해 업데이트 하면서 DP로 어디를 지나왔는 지 추적해야했다.
📚오늘의 회고
- 첫번째 지점을 찾기 위해 지나온 점을 계속 추적해 나가는 방법을 사용했다.
- 테스트시 사용했던 코드는 꼭 지우자^^
[🤓문제 해결 코드]
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N, M, a, b, c;
static int[][] arr, ans, edges;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N+1][N+1];
ans = new int[N+1][N+1];
edges = new int[N+1][N+1];
for(int i=0; i<=N; i++) {
for(int j=0; j<=N; j++) {
arr[i][j] = 100001;
ans[i][j] = 2000;
}
arr[i][i] = 0;
}
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
arr[a][b] = c;
arr[b][a] = c;
ans[a][b] = b;
ans[b][a] = a;
edges[a][b] = 1;
edges[b][a] = 1;
}
for(int k=1; k<=N; k++) {
for (int i=1; i<=N; i++) {
for (int j=1; j<=N; j++) {
if(arr[i][j] > arr[i][k] + arr[k][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
int t = k;
while(i != t) {
if(ans[i][t] == t) {
ans[i][j] = t;
break;
}
t = ans[i][t];
}
}
}
}
}
for (int i=1; i<=N; i++) {
for (int j=1; j<=N; j++) {
if(i==j)
sb.append("- " );
else
sb.append(ans[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
}
728x90
'코딩테스트' 카테고리의 다른 글
백준 2842 집배원 한상덕 (0) | 2025.02.20 |
---|---|
백준 2342 Dance Dance Revolution 자바 (1) | 2025.02.19 |
백준 17609 회문 자바 (0) | 2025.02.19 |
백준 11404 플로이드 (0) | 2025.02.18 |
삼성 SDS 2025년도 상반기 알고리즘 특강 기록 (0) | 2025.02.18 |