합승 택시 요금 : https://programmers.co.kr/learn/courses/30/lessons/72413
시작점 S에서 각각 A와 B로 가는 최소 비용을 구하는 문제.
그래프의 최소 거리(비용)을 구하는 문제이고 시작점이 있어서 다익스트라 알고리즘
을 활용해서 풀수 있겠지만, 특정 지점까지 함께 갔다가 나눠서 각자의 목적지까지 가는 예시와 그래프의 크기가 최대 25인것을 보고 플로이드 와샬
로 풀면 되겠구나 생각을 했다.
(플로이드 와샬 풀이 : https://velog.io/@hyunjong96/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84)
문제 풀이 순서는 아래와 같다.
import java.util.Arrays;
class Solution {
public int solution(int n, int s, int a, int b, int[][] fares) {
int INF = 100000000;
int[][] map = new int[n+1][n+1];
//그래프 무한대 값을 나타내는 INF로 초기화
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
map[i][j] = INF;
}
map[i][i] = 0;
}
for(int[] fare : fares){
int c = fare[0];
int d = fare[1];
int f = fare[2];
map[c][d] = f;
map[d][c] = f;
}
//거쳐가는 정점
for(int k = 1;k<=n;k++){
for(int i = 1;i<=n;i++){
for(int j=1;j<=n;j++){
//플로이드 와샬의 핵심
//기존의 가중치보다 k정점을 거친 가중치가 작다면 갱신
if(map[i][j]>map[i][k]+map[k][j]){
map[i][j] = map[i][k]+map[k][j];
}
}
}
}
int answer = Integer.MAX_VALUE;
//시작점 S부터 K정점을 거쳐 A와 B까지 가는 최소거리 비교
for(int k=1;k<=n;k++){
answer = Math.min(answer, map[s][k]+map[k][a]+map[k][b]);
}
return answer;
}
}