HOME

TheInfoList



OR:

In
graph theory In mathematics, graph theory is the study of '' graphs'', which are mathematical structures used to model pairwise relations between objects. A graph in this context is made up of '' vertices'' (also called ''nodes'' or ''points'') which are conn ...
, the strongly connected components of a directed graph may be found using an algorithm that uses
depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible alo ...
in combination with two stacks, one to keep track of the vertices in the current component and the second to keep track of the current search path. Versions of this algorithm have been proposed by , , , , and ; of these, Dijkstra's version was the first to achieve
linear time In computer science, the time complexity is the computational complexity that describes the amount of computer time it takes to run an algorithm. Time complexity is commonly estimated by counting the number of elementary operations performed by t ...
.History of Path-based DFS for Strong Components
Harold N. Gabow, accessed 2012-04-24.


Description

The algorithm performs a depth-first search of the given graph ''G'', maintaining as it does two stacks ''S'' and ''P'' (in addition to the normal call stack for a recursive function). Stack ''S'' contains all the vertices that have not yet been assigned to a strongly connected component, in the order in which the depth-first search reaches the vertices. Stack ''P'' contains vertices that have not yet been determined to belong to different strongly connected components from each other. It also uses a counter ''C'' of the number of vertices reached so far, which it uses to compute the preorder numbers of the vertices. When the depth-first search reaches a vertex ''v'', the algorithm performs the following steps: #Set the preorder number of ''v'' to ''C'', and increment ''C''. #Push ''v'' onto ''S'' and also onto ''P''. #For each edge from ''v'' to a neighboring vertex ''w'': #* If the preorder number of ''w'' has not yet been assigned (the edge is a tree edge), recursively search ''w''; #*Otherwise, if ''w'' has not yet been assigned to a strongly connected component (the edge is a forward/back/cross edge): #**Repeatedly pop vertices from ''P'' until the top element of ''P'' has a preorder number less than or equal to the preorder number of ''w''. #If ''v'' is the top element of ''P'': #*Pop vertices from ''S'' until ''v'' has been popped, and assign the popped vertices to a new component. #*Pop ''v'' from ''P''. The overall algorithm consists of a loop through the vertices of the graph, calling this recursive search on each vertex that does not yet have a preorder number assigned to it.


Related algorithms

Like this algorithm, Tarjan's strongly connected components algorithm also uses depth first search together with a stack to keep track of vertices that have not yet been assigned to a component, and moves these vertices into a new component when it finishes expanding the final vertex of its component. However, in place of the stack ''P'', Tarjan's algorithm uses a vertex-indexed
array An array is a systematic arrangement of similar objects, usually in rows and columns. Things called an array include: {{TOC right Music * In twelve-tone and serial composition, the presentation of simultaneous twelve-tone sets such that the ...
of preorder numbers, assigned in the order that vertices are first visited in the
depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible alo ...
. The preorder array is used to keep track of when to form a new component.


Notes


References

*. *. *. *. *. *{{citation , last = Sedgewick , first = R. , contribution = 19.8 Strong Components in Digraphs , edition = 3rd , location = Cambridge MA , pages = 205–216 , publisher = Addison-Wesley , title = Algorithms in Java, Part 5 – Graph Algorithms , year = 2004. Graph algorithms Graph connectivity