-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Tarjan's algorithm for computing the strongly connected components of a graph.
--   
--   Tarjan's algorithm for computing the strongly connected components of
--   a graph.
@package GraphSCC
@version 1.0.4

module Data.Graph.SCC

-- | Computes the strongly connected components (SCCs) of the graph in
--   O(#edges + #vertices) time. The resulting tuple contains:
--   
--   
--   
- A (reversed) topologically sorted list of SCCs. Each SCCs is
--   assigned a unique identifier of type Int.
--   
- An O(1) mapping from vertices in the original graph to the
--   identifier of their SCC. This mapping will raise an "out of bounds"
--   exception if it is applied to integers that do not correspond to
--   vertices in the input graph.
--   
--   
--   This function assumes that the adjacency lists in the original graph
--   mention only nodes that are in the graph. Violating this assumption
--   will result in "out of bounds" array exception.
scc :: Graph -> ([(Int, [Vertex])], Vertex -> Int)

-- | Compute the list of strongly connected components of a graph. The
--   components are topologically sorted: if v1 in C1 points to v2 in C2,
--   then C2 will come before C1 in the list.
sccList :: Graph -> [SCC Vertex]

-- | Compute the list of strongly connected components of a graph. Each
--   component contains the adjecency information from the original graph.
--   The components are topologically sorted: if v1 in C1 points to v2 in
--   C2, then C2 will come before C1 in the list.
sccListR :: Graph -> [SCC (Vertex, [Vertex])]

-- | Quotient a graph with the relation that relates vertices that belong
--   to the same SCC. The vertices in the new graph are the SCCs of the old
--   graph, and there is an edge between two components, if there is an
--   edge between any of their vertices. The entries in the resulting list
--   are in reversed-topologically sorted: if v1 in C1 points to v2 in C2,
--   then C1 will come before C2 in the list.
sccGraph :: Graph -> [(SCC Int, Int, [Int])]
stronglyConnComp :: Ord key => [(node, key, [key])] -> [SCC node]
stronglyConnCompR :: Ord key => [(node, key, [key])] -> [SCC (node, key, [key])]
