LeetCode 1192. Critical Connections in a Network in F#

URL

leetcode.com/problems/critical-connections-..

Code

github.com/syohex/dotnet-study/blob/master/..

open System

let toGraph (conns: (int * int) list) : Map<int, int list> =
    conns
    |> List.fold
        (fun acc (src, dest) ->
            let acc' =
                match Map.tryFind src acc with
                | None -> Map.add src [ dest ] acc
                | Some (v) -> Map.add src (dest :: v) acc

            match Map.tryFind dest acc' with
            | None -> Map.add dest [ src ] acc'
            | Some (v) -> Map.add dest (src :: v) acc')
        Map.empty

let criticalConnections (n: int) (connections: (int * int) list) : (int * int) list =
    let rec f
        (node: int)
        (parent: int)
        (rank: int)
        (graph: Map<int, int list>)
        (visited: Map<int, int>)
        (acc: (int * int) list)
        : (int * Map<int, int> * (int * int) list) =
        match Map.tryFind node visited with
        | Some (v) -> v, visited, acc
        | None ->
            let visited' = Map.add node rank visited

            Map.find node graph
            |> List.fold
                (fun (minRank, visited, acc) next ->
                    if next = parent then
                        minRank, visited, acc
                    else
                        let rank', visited', acc' = f next node (rank + 1) graph visited acc

                        if rank' = rank + 1 then
                            Math.Min(minRank, rank'), visited', ((node, next) :: acc')
                        else
                            Math.Min(minRank, rank'), visited', acc')
                (rank, visited', acc)


    let graph = toGraph connections
    let _, _, ret = f 0 -1 0 graph Map.empty []
    ret