fgl-5.5.2.0: Data/Graph/Inductive/Query/TransClos.hs
module Data.Graph.Inductive.Query.TransClos(
trc
) where
import Data.Graph.Inductive.Graph
import Data.Graph.Inductive.Query.DFS (reachable)
getNewEdges :: (DynGraph gr) => [LNode a] -> gr a b -> [LEdge ()]
getNewEdges vs g = map (`toLEdge` ())
. concatMap (\u -> map ((,) u) (reachable u g))
$ map fst vs
{-|
Finds the transitive closure of a directed graph.
Given a graph G=(V,E), its transitive closure is the graph:
G* = (V,E*) where E*={(i,j): i,j in V and there is a path from i to j in G}
-}
trc :: (DynGraph gr) => gr a b -> gr a ()
trc g = insEdges (getNewEdges ln g) (insNodes ln empty)
where ln = labNodes g