[プログラマー]タクシー料金の併用
11024 ワード
1.問題リンク
2.ココア解説集
1.トラブルシューティング
最小費用経路を求めるアルゴリズムは2つ存在する.
O(200 x 200 x 200 x 200)なので、完全に時間内に解決できます.
まず,floydとshallによりすべての分岐機構に対して最小経路コストを求める.
そして、始点(s)を基準として、1~nの点(i)を経て、AとBへの経路の最小費用を求める.
min(s->i + i->a + i->b)
2.ソースコード
2.ココア解説集
1.トラブルシューティング
最小費用経路を求めるアルゴリズムは2つ存在する.
1. 다익스트라
= 시작 위치를 기준으로 도착 지점까지 가는데 드는 최소 비용
2. 플로이드 와샬
= 현재 위치를 기준으로 모든 경로에서 갈 수 있는 최소 비용
Vertex(n)は3以上200以下、Degree(fars)は2以上nx(n-1)/2以下であるため、FloydとShallを選択して問題を解決した.O(200 x 200 x 200 x 200)なので、完全に時間内に解決できます.
まず,floydとshallによりすべての分岐機構に対して最小経路コストを求める.
そして、始点(s)を基準として、1~nの点(i)を経て、AとBへの経路の最小費用を求める.
min(s->i + i->a + i->b)
2.ソースコード
import java.util.*;
class Solution {
public static int solution(int n, int s, int a, int b, int[][] fares) {
int[][] floyd = new int[n][n];
int INF = 100000000;
for (int[] f : floyd) {
Arrays.fill(f, INF);
}
for(int i =0 ; i < n ; i++) {
floyd[i][i] = 0;
}
for (int i = 0; i < fares.length; i++) {
int ss = fares[i][0] - 1;
int ee = fares[i][1] - 1;
int c = fares[i][2];
floyd[ss][ee] = floyd[ee][ss] = c;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (floyd[j][k] > floyd[j][i] + floyd[i][k]) {
// 직접 가는 것보다 거쳐 가는 경우가 빠른 경우
floyd[j][k] = floyd[j][i] + floyd[i][k];
}
}
}
}
int ans = INF;
for (int i = 0; i < n; i++) {
ans = Math.min(ans, floyd[s - 1][i] + floyd[i][a - 1] + floyd[i][b - 1]);
}
return ans;
}
}
Reference
この問題について([プログラマー]タクシー料金の併用), 我々は、より多くの情報をここで見つけました https://velog.io/@jms8732/프로그래머스-합승-택시-요금テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol