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;
    }
}