@@ -23,6 +23,7 @@ Here is what the module can do:
2323 :meth:`blocks_and_cut_vertices` | Return the blocks and cut vertices of the graph.
2424 :meth:`blocks_and_cuts_tree` | Return the blocks-and-cuts tree of the graph.
2525 :meth:`biconnected_components_subgraphs` | Return a list of biconnected components as graph objects.
26+ :meth:`number_of_biconnected_components` | Return the number of biconnected components.
2627 :meth:`is_cut_edge` | Check whether the input edge is a cut-edge or a bridge.
2728 :meth:`is_edge_cut` | Check whether the input edges form an edge cut.
2829 :meth:`is_cut_vertex` | Check whether the input vertex is a cut-vertex.
@@ -818,6 +819,70 @@ def biconnected_components_subgraphs(G):
818819 return [G.subgraph(c) for c in blocks_and_cut_vertices(G)[0 ]]
819820
820821
822+ def number_of_biconnected_components (G ):
823+ r """
824+ Return the number of biconnected components.
825+
826+ A biconnected component is a maximal subgraph on two or more vertices that
827+ is biconnected, i. e. , removing any vertex does not disconnect it.
828+
829+ .. SEEALSO::
830+
831+ - :meth:`~sage. graphs. generic_graph. GenericGraph. blocks_and_cut_vertices`
832+ - :meth:`~Graph. is_biconnected`
833+
834+ EXAMPLES:
835+
836+ The disjoint union of cycles has as many biconnected components as the
837+ number of cycles::
838+
839+ sage: G = graphs. CycleGraph( 5)
840+ sage: G. number_of_biconnected_components( )
841+ 1
842+ sage: ( 3 * G) . number_of_biconnected_components( )
843+ 3
844+
845+ A block graph is a connected graph in which every biconnected component
846+ ( block) is a clique. Hence its number of biconnected components is its
847+ number of blocks::
848+
849+ sage: number_of_blocks = randint( 4, 10)
850+ sage: G = graphs. RandomBlockGraph( number_of_blocks, 5)
851+ sage: G. number_of_biconnected_components( ) == number_of_blocks
852+ True
853+
854+ By definition, an edge is a biconnected component. Hence, the number of
855+ biconnected components of a tree is its number of edges::
856+
857+ sage: T = graphs. RandomTree( randint( 0, 10))
858+ sage: T. number_of_biconnected_components( ) == T. size( )
859+ True
860+
861+ An isolated vertex is a block but not a biconnected component::
862+
863+ sage: G = Graph( 3)
864+ sage: len( G. blocks_and_cut_vertices( ) [0 ])
865+ 3
866+ sage: G. number_of_biconnected_components( )
867+ 0
868+
869+ TESTS:
870+
871+ An error is raised if the input is not a Sage graph::
872+
873+ sage: from sage. graphs. connectivity import number_of_biconnected_components
874+ sage: number_of_biconnected_components( 'I am not a graph')
875+ Traceback ( most recent call last) :
876+ ...
877+ TypeError: the input must be a Sage graph
878+ """
879+ from sage.graphs.generic_graph import GenericGraph
880+ if not isinstance (G, GenericGraph):
881+ raise TypeError (" the input must be a Sage graph" )
882+
883+ return len ([c for c in G.blocks_and_cut_vertices()[0 ] if len (c) > 1 ])
884+
885+
821886def is_edge_cut (G , edges ):
822887 """
823888 Check whether ``edges`` form an edge cut.
0 commit comments