https://school.programmers.co.kr/learn/courses/30/lessons/72413
- 플로이드 워셜 알고리즘을 이용해 모든 노드 사이의 최소 거리를 구한다.
- 특정 K까지 합승한다는 가정하에 총 요금은 (S -> K) + (K -> A) + (K -> B)가 되므로 모든 K에 대해 반복하여 결과를 구한다.
import java.util.*;
class Solution {
public int INF = 987654321;
public int[][] minDist;
public int solution(int n, int s, int a, int b, int[][] fares) {
//초기화
minDist = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++)
Arrays.fill(minDist[i], INF);
for (int i = 0; i < fares.length; i++) {
minDist[fares[i][0]][fares[i][1]] = fares[i][2];
minDist[fares[i][1]][fares[i][0]] = fares[i][2];
}
//플로이드 워셜
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
minDist[i][j] = 0;
continue;
}
if (i == k || j == k) continue;
minDist[i][j] = Math.min(minDist[i][j], minDist[i][k] + minDist[k][j]);
}
}
}
int res = INF;
//결과 도출
for (int i = 1; i <= n; i++) {
if (minDist[s][i] == INF || minDist[i][a] == INF || minDist[i][b] == INF)
continue;
res = Math.min(res, minDist[s][i] + minDist[i][a] + minDist[i][b]);
}
return res;
}
}