URL
https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i/description/?envType=daily-question&envId=2024-11-27
Code
https://github.com/syohex/dotnet-study/blob/master/fsharp/leetcode/challenge/202411/shortest_distance_after_road_addition_queries1/main.fsx
let shortestDistanceAfterQueries (n: int) (queries: (int * int) list) : int list =
let rec bfs q steps goal (graph: (int list)[]) (visited: bool[]) =
match q with
| [] -> failwith "never reach here"
| _ ->
match List.tryFind ((=) goal) q with
| Some _ -> steps
| None ->
q |> List.iter (fun node -> visited.[node] <- true)
let q =
q
|> List.fold
(fun acc n ->
let nexts = graph.[n] |> List.filter (fun i -> not <| visited.[i])
nexts @ acc)
[]
bfs q (steps + 1) goal graph visited
let rec shortestDistanceAfterQueries' queries n (graph: (int list)[]) acc =
match queries with
| [] -> List.rev acc
| (s, e) :: t ->
graph.[s] <- e :: graph.[s]
let steps = bfs [ 0 ] 0 (n - 1) graph (Array.zeroCreate n)
shortestDistanceAfterQueries' t n graph (steps :: acc)
let graph =
seq { 0 .. (n - 2) }
|> Seq.fold
(fun (acc: (int list)[]) i ->
acc.[i] <- [ i + 1 ]
acc)
(Array.zeroCreate n)
shortestDistanceAfterQueries' queries n graph []