문제 풀이 : 2021.04.29
시작점부터 도착지점까지의 최소 비용에 관한 문제이고 다익스트라와 플로이드 와샬 알고리즘을 사용할 수 있다. '합승을 하는 구간' -> '거쳐가는 노드'로 해석할 수 있으므로 플로이드 와샬 알고리즘을 사용하면 된다.
class Solution {
static int[][] f;
int INF = 20000001;
public int solution(int n, int s, int a, int b, int[][] fares) {
int answer = 2147483647;
f = new int[n][n];
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++){
if(i==j)f[i][j] =0;
else f[i][j] = INF;
}
for(int i = 0 ;i<fares.length;i++){
f[fares[i][0]-1][fares[i][1]-1] = fares[i][2];
f[fares[i][1]-1][fares[i][0]-1] = fares[i][2];
}
floyd(n);
for(int i = 0;i<n;i++)
answer = Math.min(answer, f[s-1][i]+f[i][a-1]+f[i][b-1]);
return answer;
}
static void floyd(int n){
for(int k=0; k<n; k++){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(f[i][j]>f[i][k]+f[k][j])
f[i][j] = f[i][k]+f[k][j];
}
}
}
}
}