[レベル3/グラフ]タクシー料金+SWIFT
質問リンク
コードテスト練習-タクシー料金の併用
Floyd Warshallアルゴリズム
ノード1からノード5の場合は、次のようになります.
質問する
パラメータは、a,b,a,b,a,b,a,a,a,a,a,a,a,a,a,a,a,a,a,b,a,a,a,a,a,a,b,a,a,a,a,a,a,a,a,b,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,aこのとき、A、Bの2人がsから出発して、それぞれの到着点までタクシーで行くと仮定し、1つの解関数を完成して、最低の推定運賃を計算して、戻ってください.もし、いっそ便乗せずに各自で移動した場合、タクシー料金がさらに安くなる見込みであれば、便乗する必要はありません.
入力
let n = 6
let s = 4
let a = 6
let b = 2
let fares = [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]]
しゅつりょく
82
問題を解く
ノードからノードへの費用を格納するdb 2層配列を作成します.費用のデフォルトは、最大費用(100000)を超える99999999です.
料金表を1つずつ追加する費用.例えば、第1の再要素[4,10]については、ノード4~1の費用が10であるため、db[1][4]およびdb[4][1]に費用10が格納される.
これはフロイドとシエルアルゴリズムの核心です.ドアに3回使用し,iからkまでの最小費用を格納する.
例えば、i=4、j=1、k=6とする.上図に示すように、4~6の料金は50です.4から1までの費用10と1から6までの費用25を合わせた費用は35より大きい.dbは4~6の料金db[4][6]を2つの合計の料金(db[4][1]+db[1][6])に更新する.
sから中間点kまでの費用とkからaとkからbまでの費用の和を求めて、最高価格を探します.中間点のkがs値と一致すると,乗算ではなくそれぞれの移動と見なすことができる.
import Foundation
func solution(_ n:Int, _ s:Int, _ a:Int, _ b:Int, _ fares:[[Int]]) -> Int {
var db: [[Int]] = Array(repeating: Array(repeating: 999999, count: n+1), count: n+1)
var minFare = 9999999
for fare in fares {
db[fare[0]][fare[1]] = fare[2]
db[fare[1]][fare[0]] = fare[2]
}
for k in 1...n {
for i in 1...n {
for j in 1...n {
if i == j { db[i][j] = 0 }
if db[i][j] > db[i][k] + db[k][j] {
db[i][j] = db[i][k] + db[k][j]
}
}
}
}
for midpoint in 1...n {
let fare = db[s][midpoint] + db[midpoint][a] + db[midpoint][b]
if minFare > fare { minFare = fare }
}
return minFare
}
let answer = solution(n, s, a, b, fares)
print(answer)
Reference
この問題について([レベル3/グラフ]タクシー料金+SWIFT), 我々は、より多くの情報をここで見つけました https://velog.io/@leeesangheee/Level-3-그래프-합승-택시-요금-Swiftテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol