Skip to content

Commit 40ed899

Browse files
committed
avoid some calls to multiple_edges with sort=True
1 parent 10e5e9e commit 40ed899

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/sage/graphs/graph.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,7 +1514,7 @@ def is_tree(self, certificate=False, output='vertex'):
15141514
sage: G.is_tree(certificate=True)
15151515
(False, [1, 2])
15161516
sage: G.is_tree(certificate=True, output='edge')
1517-
(False, [(1, 2, 'a'), (2, 1, 'b')])
1517+
(False, [(1, 2, 'b'), (2, 1, 'a')])
15181518
15191519
TESTS:
15201520
@@ -1542,6 +1542,16 @@ def is_tree(self, certificate=False, output='vertex'):
15421542
(False, [0])
15431543
sage: G.is_tree(certificate=True, output='edge')
15441544
(False, [(0, 0, None)])
1545+
1546+
Case of edges with incomparable types::
1547+
1548+
sage: G = Graph(multiedges=True)
1549+
sage: G.add_cycle(['A', 1, 2, 3])
1550+
sage: G.add_cycle(['A', 1, 2, 3])
1551+
sage: G.is_tree(certificate=True, output='vertex')
1552+
(False, ['A', 1])
1553+
sage: G.is_tree(certificate=True, output='edge')
1554+
(False, [('A', 1, None), (1, 'A', None)])
15451555
"""
15461556
if output not in ['vertex', 'edge']:
15471557
raise ValueError('output must be either vertex or edge')
@@ -1559,12 +1569,18 @@ def is_tree(self, certificate=False, output='vertex'):
15591569
return False, L[:1]
15601570

15611571
if self.has_multiple_edges():
1572+
multiple_edges = self.multiple_edges(sort=False)
15621573
if output == 'vertex':
1563-
return (False, list(self.multiple_edges(sort=True)[0][:2]))
1564-
edge1, edge2 = self.multiple_edges(sort=True)[:2]
1565-
if edge1[0] != edge2[0]:
1566-
return (False, [edge1, edge2])
1567-
return (False, [edge1, (edge2[1], edge2[0], edge2[2])])
1574+
return (False, list(multiple_edges[0][:2]))
1575+
# Search for 2 edges between u and v.
1576+
# We do this way to handle the case of edges with incomparable
1577+
# types
1578+
u1, v1, w1 = multiple_edges[0]
1579+
for u2, v2, w2 in multiple_edges[1:]:
1580+
if u1 == u2 and v1 == v2:
1581+
return (False, [(u1, v1, w1), (v2, u2, w2)])
1582+
elif u1 == v2 and v1 == u2:
1583+
return (False, [(u1, v1, w1), (u2, v2, w2)])
15681584

15691585
if output == 'edge':
15701586
if self.allows_multiple_edges():

0 commit comments

Comments
 (0)