LeetCode 787. Cheapest Flights Within K Stops in F#
URL
Cheapest Flights Within K Stops - LeetCode
Code
https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/problems/0787/main.fsx
let flightsToGraph (flights: (int * int * int) list) : Map<int, (int * int) list> =
let rec flightsToGraph' flights acc =
match flights with
| [] -> acc
| (src, dst, cost) :: t ->
let nexts =
match Map.tryFind src acc with
| Some(v) -> (dst, cost) :: v
| None -> [ (dst, cost) ]
flightsToGraph' t (Map.add src nexts acc)
flightsToGraph' flights Map.empty
let findCheapestPrice (n: int) (flights: (int * int * int) list) (src: int) (dst: int) (k: int) : int =
let rec findCheapestPrice' q stop graph (minCosts: int[]) =
if stop >= k then
if minCosts.[dst] = System.Int32.MaxValue then
-1
else
minCosts.[dst]
else
let q' =
q
|> List.fold
(fun acc (city, costs) ->
match Map.tryFind city graph with
| None -> acc
| Some(v) ->
let nexts =
v
|> List.map (fun (next, cost) -> next, cost + costs)
|> List.filter (fun (next, totalCost) -> totalCost < minCosts.[next])
nexts @ acc)
[]
q' |> List.iter (fun (next, cost) -> minCosts.[next] <- cost)
findCheapestPrice' q' (stop + 1) graph minCosts
let graph = flightsToGraph flights
let minCosts = Array.init n (fun _ -> System.Int32.MaxValue)
findCheapestPrice' [ (src, 0) ] -1 graph minCosts