◀ ▲ ▶Branches / Graph-theory / Algorithm: Get the Cut Vertices and Biconnected Components of a Connected Graph
Let \(G(V,E)\) be a connected undirected graph. The following algorithm \(\mathtt{getBICONNECTEDCOMPONENTS(G)}\) obtains correctly all of its cutvertices and biconnected components in the time complexity \(\mathcal O(|V|+|E|)\).
Algorithm: Get the Cut Vertices and Biconnected Components of a Connected Graph
``` 
FOR v\in V
    visited[v]:=NIL; // unmark all vertices in `\(G\)` 
NEXT
B=\emptyset; // initiate empty set of all biconnected components  
S=\text{empty stack}; // initiate empty stack
enum:=-1; 
FOR v\in V
    IF visited[v]=NIL THEN 
        CALL \{\mathtt{calculateLowpoint(G,v,B,S,enum)}\}; // print all cutvertices and store biconnected components in `\(B\)`; 
    ENDIF
NEXT
RETURN B; // return all found biconnected components
// Function `\(\mathtt{calculateLowpoint(G,v,B,S,m)}\)` calculates the lowpoint of `\(v\)`.
// The lowpoint is lowest depth of all descendants of v in the depth-first-search tree  
FUNCTION \mathtt{calculateLowpoint(G,v,B,S,enum)}
    enum:=enum+1;
    visited[v]:=enum;
    numberOfDescendants[v]:=0; // set the number of descendants to 0
    lowpoint:=enum;
    S.push(v); // put `\(v\)` on a stack
    FOR n\in f(v)// for all (neighbors) `\(n\)` of `\(v\)` 
        IF visited[n] = NIL THEN // if the neighbor `\(n\)` has not yet been visited
            
            numberOfDescendants[v]:=numberOfDescendants[v]+1; // increase the number of descendants
            lowpointneighbor:=\mathtt{calculateLowpoint(G,n,B,S,enum)}; // depth-first search for the next neighbor `\(n\)`
            
            IF lowpointneighbor < lowpoint THEN
                lowpoint:=lowpointneighbor;
            ENDIF
            
            IF visited[v]==0 THEN
                ;// special case for root of DFS
                ;// root is an cutvertex iif there are two or more descendants
                IF numberOfDescendants[v]\ge 2 THEN
                    outputComponent(G,B,S,v); // a new cutvertex `\(v\)` and a new biconnected component found
                ENDIF
            ELSE
            IF (lowpointneighbor \ge visited[v] THEN
                outputComponent(G,B,S,v); // a new cutvertex `\(v\)` and a new biconnected component found
            ENDIF
        ELSE
            IF visited[n] < lowpoint THEN
                lowpoint=visited[n]; 
            ENDIF
        ENDIF
    NEXT
    RETURN lowpoint;
ENDFUNCTION
// function `\(\mathtt{outputComponent(G,B,S,v)}\)` prints the cutvertex `\(v\)` 
// and returns a subgraph of `\(G\)`,
// which is its biconnected component 
FUNCTION outputComponent(G,B,S,v)
    PRINT v; // new cutvertex found
    V:=\emptyset; // initiate an empty set of vertices
    REPEAT
        x:=S.pull(); // pull vertex from stack
        V:=V\cup \{x\}; // add vertex to set `\(V\)`
    UNTIL x=v; // until the vertex `\(v\)` is reached
    B:=B\cup \{G[V]\}; // output the subgraph of `\(G\)` induced by `\(V\)` (=biconnected component of `\(G\)`) 
    S.push(v); // put cutvertex `\(v\)` on a stack as part of the next biconnected component 
ENDFUNCTION
Table of Contents
Proofs: 1 
Thank you to the contributors under CC BY-SA 4.0!   
  
- Github:
-   
 
References
Bibliography
- Sedgewick, Robert: "Algorithmen in C++", Addison-Wesley, 1992, 1st Edition