Basic graphs¶
The methods defined here appear in sage.graphs.graph_generators
.

sage.graphs.generators.basic.
BullGraph
()¶ Return a bull graph with 5 nodes.
A bull graph is named for its shape. It’s a triangle with horns. See the Wikipedia article Bull_graph for more information.
PLOTTING:
Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the bull graph is drawn as a triangle with the first node (0) on the bottom. The second and third nodes (1 and 2) complete the triangle. Node 3 is the horn connected to 1 and node 4 is the horn connected to node 2.
EXAMPLES:
Construct and show a bull graph:
sage: g = graphs.BullGraph(); g Bull graph: Graph on 5 vertices sage: g.show() # long time
The bull graph has 5 vertices and 5 edges. Its radius is 2, its diameter 3, and its girth 3. The bull graph is planar with chromatic number 3 and chromatic index also 3:
sage: g.order(); g.size() 5 5 sage: g.radius(); g.diameter(); g.girth() 2 3 3 sage: g.chromatic_number() 3
The bull graph has chromatic polynomial \(x(x  2)(x  1)^3\) and Tutte polynomial \(x^4 + x^3 + x^2 y\). Its characteristic polynomial is \(x(x^2  x  3)(x^2 + x  1)\), which follows from the definition of characteristic polynomials for graphs, i.e. \(\det(xI  A)\), where \(x\) is a variable, \(A\) the adjacency matrix of the graph, and \(I\) the identity matrix of the same dimensions as \(A\):
sage: chrompoly = g.chromatic_polynomial() sage: bool(expand(x * (x  2) * (x  1)^3) == chrompoly) True sage: charpoly = g.characteristic_polynomial() sage: M = g.adjacency_matrix(); M [0 1 1 0 0] [1 0 1 1 0] [1 1 0 0 1] [0 1 0 0 0] [0 0 1 0 0] sage: Id = identity_matrix(ZZ, M.nrows()) sage: D = x*Id  M sage: bool(D.determinant() == charpoly) True sage: bool(expand(x * (x^2  x  3) * (x^2 + x  1)) == charpoly) True

sage.graphs.generators.basic.
ButterflyGraph
()¶ Return the butterfly graph.
Let \(C_3\) be the cycle graph on 3 vertices. The butterfly or bowtie graph is obtained by joining two copies of \(C_3\) at a common vertex, resulting in a graph that is isomorphic to the friendship graph \(F_2\). See the Wikipedia article Butterfly_graph for more information.
See also
GraphGenerators.FriendshipGraph()
EXAMPLES:
The butterfly graph is a planar graph on 5 vertices and having 6 edges:
sage: G = graphs.ButterflyGraph(); G Butterfly graph: Graph on 5 vertices sage: G.show() # long time sage: G.is_planar() True sage: G.order() 5 sage: G.size() 6
It has diameter 2, girth 3, and radius 1:
sage: G.diameter() 2 sage: G.girth() 3 sage: G.radius() 1
The butterfly graph is Eulerian, with chromatic number 3:
sage: G.is_eulerian() True sage: G.chromatic_number() 3

sage.graphs.generators.basic.
CircularLadderGraph
(n)¶ Return a circular ladder graph with \(2 * n\) nodes.
A Circular ladder graph is a ladder graph that is connected at the ends, i.e.: a ladder bent around so that top meets bottom. Thus it can be described as two parallel cycle graphs connected at each corresponding node pair.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the circular ladder graph is displayed as an inner and outer cycle pair, with the first \(n\) nodes drawn on the inner circle. The first (0) node is drawn at the top of the innercircle, moving clockwise after that. The outer circle is drawn with the \((n+1)\), we rotate the outer circle by an angle of \(\pi/8\) to ensure that all edges are visible (otherwise the 4 vertices of the graph would be placed on a single line).
EXAMPLES:
Construct and show a circular ladder graph with 26 nodes:
sage: g = graphs.CircularLadderGraph(13) sage: g.show() # long time
Create several circular ladder graphs in a Sage graphics array:
sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.CircularLadderGraph(i+3) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time

sage.graphs.generators.basic.
ClawGraph
()¶ Return a claw graph.
A claw graph is named for its shape. It is actually a complete bipartite graph with
(n1, n2) = (1, 3)
.PLOTTING: See
CompleteBipartiteGraph()
.EXAMPLES:
Show a Claw graph:
sage: (graphs.ClawGraph()).show() # long time
Inspect a Claw graph:
sage: G = graphs.ClawGraph() sage: G Claw graph: Graph on 4 vertices

sage.graphs.generators.basic.
CompleteBipartiteGraph
(p, q, set_position=True)¶ Return a Complete Bipartite Graph on \(p + q\) vertices.
A Complete Bipartite Graph is a graph with its vertices partitioned into two groups, \(V_1 = \{0,...,p1\}\) and \(V_2 = \{p,...,p+q1\}\). Each \(u \in V_1\) is connected to every \(v \in V_2\).
INPUT:
p,q
– number of vertices in each sideset_position
– boolean (defaultTrue
); if set toTrue
, we assign positions to the vertices so that the set of cardinality \(p\) is on the line \(y=1\) and the set of cardinality \(q\) is on the line \(y=0\).
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, each complete bipartite graph will be displayed with the first \(p\) nodes on the top row (at \(y=1\)) from left to right. The remaining \(q\) nodes appear at \(y=0\), also from left to right. The shorter row (partition with fewer nodes) is stretched to the same length as the longer row, unless the shorter row has 1 node; in which case it is centered. The \(x\) values in the plot are in domain \([0, \max(p, q)]\).
In the Complete Bipartite graph, there is a visual difference in using the springlayout algorithm vs. the position dictionary used in this constructor. The position dictionary flattens the graph and separates the partitioned nodes, making it clear which nodes an edge is connected to. The Complete Bipartite graph plotted with the springlayout algorithm tends to center the nodes in \(p\) (see
spring_med
in examples below), thus overlapping its nodes and edges, making it typically hard to decipher.Filling the position dictionary in advance adds \(O(n)\) to the constructor. Feel free to race the constructors below in the examples section. The much larger difference is the time added by the springlayout algorithm when plotting. (Also shown in the example below). The spring model is typically described as \(O(n^3)\), as appears to be the case in the NetworkX source code.
EXAMPLES:
Two ways of constructing the complete bipartite graph, using different layout algorithms:
sage: import networkx sage: n = networkx.complete_bipartite_graph(389, 157); spring_big = Graph(n) # long time sage: posdict_big = graphs.CompleteBipartiteGraph(389, 157) # long time
Compare the plotting:
sage: n = networkx.complete_bipartite_graph(11, 17) sage: spring_med = Graph(n) sage: posdict_med = graphs.CompleteBipartiteGraph(11, 17)
Notice here how the springlayout tends to center the nodes of \(n1\):
sage: spring_med.show() # long time sage: posdict_med.show() # long time
View many complete bipartite graphs with a Sage Graphics Array, with this constructor (i.e., the position dictionary filled):
sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.CompleteBipartiteGraph(i+1,4) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
We compare to plotting with the springlayout algorithm:
sage: g = [] sage: j = [] sage: for i in range(9): ....: spr = networkx.complete_bipartite_graph(i+1,4) ....: k = Graph(spr) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
sage: graphs.CompleteBipartiteGraph(5,6).complement() complement(Complete bipartite graph of order 5+6): Graph on 11 vertices

sage.graphs.generators.basic.
CompleteGraph
(n)¶ Return a complete graph on \(n\) nodes.
A Complete Graph is a graph in which all nodes are connected to all other nodes.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, each complete graph will be displayed with the first (0) node at the top, with the rest following in a counterclockwise manner.
In the complete graph, there is a big difference visually in using the springlayout algorithm vs. the position dictionary used in this constructor. The position dictionary flattens the graph, making it clear which nodes an edge is connected to. But the complete graph offers a good example of how the springlayout works. The edges push outward (everything is connected), causing the graph to appear as a 3dimensional pointy ball. (See examples below).
EXAMPLES:
We view many Complete graphs with a Sage Graphics Array, first with this constructor (i.e., the position dictionary filled):
sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.CompleteGraph(i+3) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
We compare to plotting with the springlayout algorithm:
sage: import networkx sage: g = [] sage: j = [] sage: for i in range(9): ....: spr = networkx.complete_graph(i+3) ....: k = Graph(spr) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
Compare the constructors (results will vary):
sage: import networkx sage: t = cputime() sage: n = networkx.complete_graph(389); spring389 = Graph(n) sage: cputime(t) # random 0.59203700000000126 sage: t = cputime() sage: posdict389 = graphs.CompleteGraph(389) sage: cputime(t) # random 0.6680419999999998
We compare plotting:
sage: import networkx sage: n = networkx.complete_graph(23) sage: spring23 = Graph(n) sage: posdict23 = graphs.CompleteGraph(23) sage: spring23.show() # long time sage: posdict23.show() # long time

sage.graphs.generators.basic.
CompleteMultipartiteGraph
(l)¶ Return a complete multipartite graph.
INPUT:
l
– a list of integers; the respective sizes of the components
PLOTTING: Produce a layout of the vertices so that vertices in the same vertex set are adjacent and clearly separated from vertices in other vertex sets.
This is done by calculating the vertices of an \(r\)gon then calculating the slope between adjacent vertices. We then ‘walk’ around the \(r\)gon placing graph vertices in regular intervals between adjacent vertices of the \(r\)gon.
Makes a nicely organized graph like in this picture: https://commons.wikimedia.org/wiki/File:Turan_134.svg
EXAMPLES:
A complete tripartite graph with sets of sizes \(5, 6, 8\):
sage: g = graphs.CompleteMultipartiteGraph([5, 6, 8]); g Multipartite Graph with set sizes [5, 6, 8]: Graph on 19 vertices
It clearly has a chromatic number of 3:
sage: g.chromatic_number() 3

sage.graphs.generators.basic.
CycleGraph
(n)¶ Return a cycle graph with \(n\) nodes.
A cycle graph is a basic structure which is also typically called an \(n\)gon.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, each cycle graph will be displayed with the first (0) node at the top, with the rest following in a counterclockwise manner.
The cycle graph is a good opportunity to compare efficiency of filling a position dictionary vs. using the springlayout algorithm for plotting. Because the cycle graph is very symmetric, the resulting plots should be similar (in cases of small \(n\)).
Filling the position dictionary in advance adds \(O(n)\) to the constructor.
EXAMPLES:
Compare plotting using the predefined layout and networkx:
sage: import networkx sage: n = networkx.cycle_graph(23) sage: spring23 = Graph(n) sage: posdict23 = graphs.CycleGraph(23) sage: spring23.show() # long time sage: posdict23.show() # long time
We next view many cycle graphs as a Sage graphics array. First we use the
CycleGraph
constructor, which fills in the position dictionary:sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.CycleGraph(i+3) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
Compare to plotting with the springlayout algorithm:
sage: g = [] sage: j = [] sage: for i in range(9): ....: spr = networkx.cycle_graph(i+3) ....: k = Graph(spr) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time

sage.graphs.generators.basic.
DartGraph
()¶ Return a dart graph with 5 nodes.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the dart graph is drawn as a dart, with the sharp part on the bottom.
EXAMPLES:
Construct and show a dart graph:
sage: g = graphs.DartGraph() sage: g.show() # long time

sage.graphs.generators.basic.
DiamondGraph
()¶ Return a diamond graph with 4 nodes.
A diamond graph is a square with one pair of diagonal nodes connected.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the diamond graph is drawn as a diamond, with the first node on top, second on the left, third on the right, and fourth on the bottom; with the second and third node connected.
EXAMPLES:
Construct and show a diamond graph:
sage: g = graphs.DiamondGraph() sage: g.show() # long time

sage.graphs.generators.basic.
EmptyGraph
()¶ Return an empty graph (0 nodes and 0 edges).
This is useful for constructing graphs by adding edges and vertices individually or in a loop.
PLOTTING: When plotting, this graph will use the default springlayout algorithm, unless a position dictionary is specified.
EXAMPLES:
Add one vertex to an empty graph and then show:
sage: empty1 = graphs.EmptyGraph() sage: empty1.add_vertex() 0 sage: empty1.show() # long time
Use for loops to build a graph from an empty graph:
sage: empty2 = graphs.EmptyGraph() sage: for i in range(5): ....: empty2.add_vertex() # add 5 nodes, labeled 04 0 1 2 3 4 sage: for i in range(3): ....: empty2.add_edge(i,i+1) # add edges {[0:1],[1:2],[2:3]} sage: for i in range(1, 4): ....: empty2.add_edge(4,i) # add edges {[1:4],[2:4],[3:4]} sage: empty2.show() # long time

sage.graphs.generators.basic.
ForkGraph
()¶ Return a fork graph with 5 nodes.
A fork graph, sometimes also called chair graph, is 5 vertex tree.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the fork graph is drawn as a fork, with the sharp part on the bottom.
EXAMPLES:
Construct and show a fork graph:
sage: g = graphs.ForkGraph() sage: g.show() # long time

sage.graphs.generators.basic.
GemGraph
()¶ Return a gem graph with 5 nodes.
A gem graph is a fan graph (4,1).
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the gem graph is drawn as a gem, with the sharp part on the bottom.
EXAMPLES:
Construct and show a gem graph:
sage: g = graphs.GemGraph() sage: g.show() # long time

sage.graphs.generators.basic.
Grid2dGraph
(p, q, set_positions=True)¶ Return a \(2\)dimensional grid graph with \(p \times q\) nodes (\(p\) rows and \(q\) columns).
A 2d grid graph resembles a \(2\) dimensional grid. All inner nodes are connected to their \(4\) neighbors. Outer (noncorner) nodes are connected to their \(3\) neighbors. Corner nodes are connected to their 2 neighbors.
INPUT:
p
andq
– two positive integersset_positions
– boolean (default:True
); whether to set the position of the nodes
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, nodes are labelled in (row, column) pairs with \((0, 0)\) in the top left corner. Edges will always be horizontal and vertical  another advantage of filling the position dictionary.
EXAMPLES:
Construct and show a grid 2d graph Rows = \(5\), Columns = \(7\):
sage: g = graphs.Grid2dGraph(5,7) sage: g.show() # long time

sage.graphs.generators.basic.
GridGraph
(dim_list)¶ Return an \(n\)dimensional grid graph.
INPUT:
dim_list
– a list of integers representing the number of nodes toextend in each dimension
PLOTTING: When plotting, this graph will use the default springlayout algorithm, unless a position dictionary is specified.
EXAMPLES:
sage: G = graphs.GridGraph([2,3,4]) sage: G.show() # long time
sage: C = graphs.CubeGraph(4) sage: G = graphs.GridGraph([2,2,2,2]) sage: C.show() # long time sage: G.show() # long time

sage.graphs.generators.basic.
HouseGraph
()¶ Return a house graph with 5 nodes.
A house graph is named for its shape. It is a triangle (roof) over a square (walls).
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the house graph is drawn with the first node in the lowerleft corner of the house, the second in the lowerright corner of the house. The third node is in the upperleft corner connecting the roof to the wall, and the fourth is in the upperright corner connecting the roof to the wall. The fifth node is the top of the roof, connected only to the third and fourth.
EXAMPLES:
Construct and show a house graph:
sage: g = graphs.HouseGraph() sage: g.show() # long time

sage.graphs.generators.basic.
HouseXGraph
()¶ Return a house X graph with 5 nodes.
A house X graph is a house graph with two additional edges. The upperright corner is connected to the lowerleft. And the upperleft corner is connected to the lowerright.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the house X graph is drawn with the first node in the lowerleft corner of the house, the second in the lowerright corner of the house. The third node is in the upperleft corner connecting the roof to the wall, and the fourth is in the upperright corner connecting the roof to the wall. The fifth node is the top of the roof, connected only to the third and fourth.
EXAMPLES:
Construct and show a house X graph:
sage: g = graphs.HouseXGraph() sage: g.show() # long time

sage.graphs.generators.basic.
LadderGraph
(n)¶ Return a ladder graph with \(2 * n\) nodes.
A ladder graph is a basic structure that is typically displayed as a ladder, i.e.: two parallel path graphs connected at each corresponding node pair.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, each ladder graph will be displayed horizontally, with the first n nodes displayed left to right on the top horizontal line.
EXAMPLES:
Construct and show a ladder graph with 14 nodes:
sage: g = graphs.LadderGraph(7) sage: g.show() # long time
Create several ladder graphs in a Sage graphics array:
sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.LadderGraph(i+2) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time

sage.graphs.generators.basic.
PathGraph
(n, pos=None)¶ Return a path graph with \(n\) nodes.
A path graph is a graph where all inner nodes are connected to their two neighbors and the two endnodes are connected to their one inner neighbors (i.e.: a cycle graph without the first and last node connected).
INPUT:
n
– number of nodes of the path graphpos
– string (default:None
); indicates the embedding to use between ‘circle’, ‘line’ or the default algorithm. See the plotting section below for more detail.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, the graph may be drawn in one of two ways: The ‘line’ argument will draw the graph in a horizontal line (left to right) if there are less than 11 nodes. Otherwise the ‘line’ argument will append horizontal lines of length 10 nodes below, alternating left to right and right to left. The ‘circle’ argument will cause the graph to be drawn in a cycleshape, with the first node at the top and then about the circle in a clockwise manner. By default (without an appropriate string argument) the graph will be drawn as a ‘circle’ if \(10 < n < 41\) and as a ‘line’ for all other \(n\).
EXAMPLES: Show default drawing by size: ‘line’: \(n \leq 10\)
sage: p = graphs.PathGraph(10) sage: p.show() # long time
‘circle’: \(10 < n < 41\)
sage: q = graphs.PathGraph(25) sage: q.show() # long time
‘line’: \(n \geq 41\)
sage: r = graphs.PathGraph(55) sage: r.show() # long time
Override the default drawing:
sage: s = graphs.PathGraph(5,'circle') sage: s.show() # long time

sage.graphs.generators.basic.
StarGraph
(n)¶ Return a star graph with \(n + 1\) nodes.
A Star graph is a basic structure where one node is connected to all other nodes.
PLOTTING: Upon construction, the position dictionary is filled to override the springlayout algorithm. By convention, each star graph will be displayed with the first (0) node in the center, the second node (1) at the top, with the rest following in a counterclockwise manner. (0) is the node connected to all other nodes.
The star graph is a good opportunity to compare efficiency of filling a position dictionary vs. using the springlayout algorithm for plotting. As far as display, the springlayout should push all other nodes away from the (0) node, and thus look very similar to this constructor’s positioning.
EXAMPLES:
sage: import networkx
Compare the plots:
sage: n = networkx.star_graph(23) sage: spring23 = Graph(n) sage: posdict23 = graphs.StarGraph(23) sage: spring23.show() # long time sage: posdict23.show() # long time
View many star graphs as a Sage Graphics Array
With this constructor (i.e., the position dictionary filled)
sage: g = [] sage: j = [] sage: for i in range(9): ....: k = graphs.StarGraph(i+3) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time
Compared to plotting with the springlayout algorithm
sage: g = [] sage: j = [] sage: for i in range(9): ....: spr = networkx.star_graph(i+3) ....: k = Graph(spr) ....: g.append(k) sage: for i in range(3): ....: n = [] ....: for m in range(3): ....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False)) ....: j.append(n) sage: G = graphics_array(j) sage: G.show() # long time

sage.graphs.generators.basic.
Toroidal6RegularGrid2dGraph
(p, q)¶ Return a toroidal 6regular grid.
The toroidal 6regular grid is a 6regular graph on \(p \times q\) vertices and its elements have coordinates \((i, j)\) for \(i \in \{0...p1\}\) and \(j \in \{0...q1\}\).
Its edges are those of the
ToroidalGrid2dGraph()
, to which are added the edges between \((i, j)\) and \(((i + 1) \% p, (j + 1) \% q)\).INPUT:
p, q
– integers (see above)
EXAMPLES:
The toroidal 6regular grid on \(25\) elements:
sage: g = graphs.Toroidal6RegularGrid2dGraph(5,5) sage: g.is_regular(k=6) True sage: g.is_vertex_transitive() True sage: g.line_graph().is_vertex_transitive() True sage: g.automorphism_group().cardinality() 300 sage: g.is_hamiltonian() True

sage.graphs.generators.basic.
ToroidalGrid2dGraph
(p, q)¶ Return a toroidal 2dimensional grid graph with \(p \times q\) nodes (\(p\) rows and \(q\) columns).
The toroidal 2dimensional grid with parameters \(p,q\) is the 2dimensional grid graph with identical parameters to which are added the edges \(((i, 0), (i, q  1))\) and \(((0, i), (p  1, i))\).
EXAMPLES:
The toroidal 2dimensional grid is a regular graph, while the usual 2dimensional grid is not
sage: tgrid = graphs.ToroidalGrid2dGraph(8,9) sage: print(tgrid) Toroidal 2D Grid Graph with parameters 8,9 sage: grid = graphs.Grid2dGraph(8,9) sage: grid.is_regular() False sage: tgrid.is_regular() True