Edge connectivity#

This module implements methods for computing the edge-connectivity of graphs and digraphs. It also implements methods to extract \(k\) edge-disjoint spanning trees from a \(2k\) edge-connected graph or a \(k\) edge-connected digraph.

Todo

  • Implement the tree-packing algorithms proposed in [Gabow1995] and [BHKP2008]

  • Extend to digraphs with multiple edges

  • Extend to weighted digraphs

class sage.graphs.edge_connectivity.GabowEdgeConnectivity#

Bases: object

Gabow’s algorithm for finding the edge connectivity of digraphs.

This class implements the algorithm proposed in [Gabow1995] for finding the edge connectivity of a directed graph and \(k\) edge disjoint spanning trees if the digraph is \(k\) edge connected.

Warning

Multiple edges are currently not supported. The current implementation act as if the digraph is simple and so the return results might not be correct. We therefore raise an error if the digraph has multiple edges.

INPUT:

EXAMPLES:

A random \(d\)-regular digraph is \(d\)-edge-connected:

sage: from sage.graphs.edge_connectivity import GabowEdgeConnectivity
sage: D = DiGraph(graphs.RandomRegular(6, 50))                                  # needs networkx
sage: while not D.is_strongly_connected():                                      # needs networkx
....:     D = DiGraph(graphs.RandomRegular(6, 50))
sage: GabowEdgeConnectivity(D).edge_connectivity()                              # needs networkx
6

A complete digraph with \(n\) vertices is \(n-1\)-edge-connected:

sage: from sage.graphs.edge_connectivity import GabowEdgeConnectivity
sage: D = DiGraph(digraphs.Complete(10))
sage: GabowEdgeConnectivity(D, use_rec=True).edge_connectivity()
9

Check that we get the same result when with and without the DFS-based speed-up initialization proposed in [GKLP2021]:

sage: # needs networkx
sage: G = graphs.RandomBarabasiAlbert(100, 2)
sage: D = DiGraph(G)
sage: ec1 = GabowEdgeConnectivity(D,
....:                             dfs_preprocessing=False).edge_connectivity()
sage: ec2 = GabowEdgeConnectivity(D,
....:                             dfs_preprocessing=True).edge_connectivity()
sage: ec3 = GabowEdgeConnectivity(D, dfs_preprocessing=True,
....:                             use_rec=True).edge_connectivity()
sage: ec1 == ec2 and ec2 == ec3
True
G#
edge_connectivity()#

Return the edge connectivity of the digraph.

EXAMPLES:

sage: from sage.graphs.edge_connectivity import GabowEdgeConnectivity
sage: D = digraphs.Complete(5)
sage: GabowEdgeConnectivity(D).edge_connectivity()
4
edge_disjoint_spanning_trees()#

Iterator over the edge disjoint spanning trees.

EXAMPLES:

sage: from sage.graphs.edge_connectivity import GabowEdgeConnectivity
sage: D = digraphs.Complete(5)
sage: GabowEdgeConnectivity(D).edge_disjoint_spanning_trees()
Traceback (most recent call last):
...
NotImplementedError: this method has not been implemented yet