알고리즘/백준
11404_플로이드 **
베리영young
2025. 1. 22. 11:33
사용 알고리즘: 플로이드 워셜
사용 언어: java
package week33;
import java.io.*;
import java.util.*;
public class Main {
static int[][] dp ;
static int n, m;
public static void main(String[] args) throws IOException {
init();
for (int k = 1; k < n+1; k++) {
for (int i = 1; i < n+1; i++) {
// if(i == j) continue;
for (int j = 1; j < n+1; j++) {
// if(i == j) continue;
//직행: dp[i][j]
//경유: dp[i][k] + dp[k][j]
if(dp[i][j] > dp[i][k] + dp[k][j]) {
dp[i][j] = dp[i][k] + dp[k][j];
}
}
}
}
//답
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < n+1; j++) {
if(dp[i][j] == 987654321) {
System.out.print(0+" ");
continue;
}
System.out.print(dp[i][j]+" ");
}
System.out.println();
}
}
private static void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); //도시 개수
m = sc.nextInt(); // 버스 개수
dp = new int[n+1][n+1];
for (int i = 0; i < n+1; i++) {
Arrays.fill(dp[i], 987654321);
}
for(int i=0; i<n+1; i++) {
dp[i][i] = 0;
}
for (int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int cost = sc.nextInt();
dp[a][b] = Math.min(dp[a][b], cost);
}
}
}
플로이드 워셜을 사용했는데 특정 케이스에서 풀리지 않는다면 이렇게 시도해보기!
1. k를 최상위 for문으로 바꾼다.
=> 플로이드 워셜은 경유하는 곳이 있는지를 확인하는 것!
=> 경유점을 먼저 지정하고, 그 경유점에 따라 출발/도착 위치를 바꾸면서 찾아보자
2. 초기 dp 배열의 값을 적당히 크게 설정한다.
=> 마구잡이로 Integer.MAX_VALUE를 사용하면, 더하는 과정에서 오버플로 때문에 음수가 될 수 있다.
=> 한 경로의 최대 cost와 나올 수 있는 경로의 수를 잘 조합하면 적당히 큰 수가 나올 수 있을듯.?