Skip to content

Commit

Permalink
Trac #27557: spanning_trees does not enumerate spanning trees with ed…
Browse files Browse the repository at this point in the history
…ge labels

Currently spanning_trees() method does not enumerate spanning trees with
their labels , it makes their labels None. This tickets aims to return
the correct labels of the edges.

URL: https://trac.sagemath.org/27557
Reported by: gh-rajat1433
Ticket author(s): Rajat Mittal
Reviewer(s): David Coudert
  • Loading branch information
Release Manager authored and vbraun committed Mar 30, 2019
2 parents 398706d + 957df83 commit e43613e
Showing 1 changed file with 22 additions and 6 deletions.
28 changes: 22 additions & 6 deletions src/sage/graphs/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -1431,14 +1431,19 @@ def is_directed(self):


@doc_index("Connectivity, orientations, trees")
def spanning_trees(self):
def spanning_trees(self, labels=False):
"""
Returns a list of all spanning trees.
If the graph is disconnected, returns the empty list.
Uses the Read-Tarjan backtracking algorithm [RT75]_.
INPUT:
- ``labels`` -- boolean (default: ``False``); whether to return edges
labels in the spanning trees or not
EXAMPLES::
sage: G = Graph([(1,2),(1,2),(1,3),(1,3),(2,3),(1,4)], multiedges=True)
Expand Down Expand Up @@ -1473,14 +1478,25 @@ def spanning_trees(self):
Graph on 6 vertices,
Graph on 6 vertices]
Edges of the spanning trees can be labeled or unlabeled (:trac:27557)::
sage: g = Graph([(1,2,2),(1,2,1),(1,2,4),(1,4,5)],multiedges=True)
sage: l = g.spanning_trees(labels=True)
sage: l[0].edges()
[(1, 2, 4), (1, 4, 5)]
sage: l[1].edges()
[(1, 2, 1), (1, 4, 5)]
sage: l[2].edges()
[(1, 2, 2), (1, 4, 5)]
REFERENCES:
.. [RT75] Read, R. C. and Tarjan, R. E.
Bounds on Backtrack Algorithms for Listing Cycles, Paths, and Spanning Trees
Networks, Volume 5 (1975), numer 3, pages 237-252.
"""

def _recursive_spanning_trees(G, forest):
def _recursive_spanning_trees(G, forest, labels):
"""
Returns all the spanning trees of G containing forest
"""
Expand All @@ -1491,13 +1507,13 @@ def _recursive_spanning_trees(G, forest):
return [forest.copy()]
else:
# Pick an edge e from G-forest
for e in G.edge_iterator(labels=False):
for e in G.edge_iterator(labels=labels):
if not forest.has_edge(e):
break

# 1) Recursive call with e removed from G
G.delete_edge(e)
trees = _recursive_spanning_trees(G, forest)
trees = _recursive_spanning_trees(G, forest, labels)
G.add_edge(e)

# 2) Recursive call with e include in forest
Expand All @@ -1514,7 +1530,7 @@ def _recursive_spanning_trees(G, forest):
# Actual call
forest.add_edge(e)
G.delete_edges(B)
trees.extend(_recursive_spanning_trees(G, forest))
trees.extend(_recursive_spanning_trees(G, forest, labels))
G.add_edges(B)
forest.delete_edge(e)

Expand All @@ -1524,7 +1540,7 @@ def _recursive_spanning_trees(G, forest):
forest = Graph()
forest.add_vertices(self.vertex_iterator())
forest.add_edges(self.bridges())
return _recursive_spanning_trees(Graph(self, immutable=False, loops=False), forest)
return _recursive_spanning_trees(Graph(self, immutable=False, loops=False), forest, labels)
else:
return []

Expand Down

0 comments on commit e43613e

Please sign in to comment.