coloring_nested_tire_graphs: add menagerie note on subcubic outerplanar edge 3-colorings

Standalone 4-page LaTeX note in notes/menagerie.tex with figures
generated by notes/generate_figures.py, summarizing edge 3-coloring
counts for the menagerie of subcubic outerplanar graphs:

  - Path P_n: P_e(P_n, 3) = 3 · 2^{n-2}.
  - Cycle C_n: P_e(C_n, 3) = 2^n + 2(-1)^n.
  - Star K_{1,3}: P_e = 6.
  - Corona C_n ∘ K_1: same as C_n (leaves are forced).
  - Trees with Δ ≤ 3: product over BFS-order via greedy.
  - 2-connected blocks: just cycles (chords force Δ > 3 generically).
  - Block-cut tree decomposition for general subcubic outerplanar.
  - Outside the menagerie: theta(2,2,2) = K_{2,3} (not outerplanar),
    which is the interior-dual structure of D(T) when O has a bridge.

The note is meant as a quick reference for the partial-tire-dual
paper, particularly for the spoke-only case (corona) and as
motivation for the theta-graph carve-out in the bridge case.
6 small PNG figures included.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 21:06:13 -04:00
parent 5fa6e9e840
commit c599975290
11 changed files with 777 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

@@ -0,0 +1,284 @@
"""Generate small figures for the menagerie note.
Each figure is a small graph drawing. Edges are colored when a Tait
coloring is being illustrated; otherwise edges are gray.
Figures produced:
fig_path.png -- path P_5 with a proper 3-edge-coloring
fig_cycle.png -- cycle C_6 with a proper 3-edge-coloring
fig_corona.png -- corona C_5 ∘ K_1 with a proper 3-edge-coloring
fig_star.png -- star K_{1,3} with a proper 3-edge-coloring
fig_blocktree.png -- a subcubic outerplanar example showing two
cycle-blocks attached at a cut-vertex
fig_theta.png -- theta(2,2,2) = K_{2,3}: NOT outerplanar (counter-
example, drawn in red)
"""
import math
import os
import matplotlib.pyplot as plt
HERE = os.path.dirname(os.path.abspath(__file__))
COLORS = ['#1f77b4', '#d62728', '#2ca02c'] # a, b, c for the 3 colors
def draw_graph(ax, pos, edges, edge_colors=None, vertex_color='black',
vertex_size=140, edge_width=2.5, show_labels=True):
"""Draw a small graph; pos = dict v->(x,y); edges = list of (u,v);
edge_colors = list of color strings matching edges, or None for gray."""
for i, (u, v) in enumerate(edges):
x1, y1 = pos[u]; x2, y2 = pos[v]
c = edge_colors[i] if edge_colors else '#888888'
ax.plot([x1, x2], [y1, y2], color=c, linewidth=edge_width,
solid_capstyle='round', zorder=1)
for v, (x, y) in pos.items():
ax.plot(x, y, 'o', color=vertex_color, markersize=vertex_size**0.5 * 2,
zorder=2)
if show_labels:
ax.annotate(str(v), (x, y), color='white', ha='center',
va='center', fontsize=8, fontweight='bold', zorder=3)
def fig_path(filename, n=5):
"""Path P_n with a proper 3-edge-coloring."""
pos = {i: (i, 0) for i in range(n)}
edges = [(i, i+1) for i in range(n-1)]
# Greedy 3-edge-coloring: alternate
edge_colors = []
used = None
for i in range(n-1):
if i == 0:
c = 0
else:
c = (used + 1) % 3
edge_colors.append(COLORS[c])
used = c
fig, ax = plt.subplots(figsize=(4.2, 1.0))
draw_graph(ax, pos, edges, edge_colors=edge_colors)
ax.set_xlim(-0.5, n - 0.5)
ax.set_ylim(-0.5, 0.5)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def fig_cycle(filename, n=6):
"""Cycle C_n with a proper 3-edge-coloring (alternating where possible)."""
pos = {i: (math.cos(2*math.pi*i/n + math.pi/2),
math.sin(2*math.pi*i/n + math.pi/2)) for i in range(n)}
edges = [(i, (i+1) % n) for i in range(n)]
# For even n, alternate 2 colors and one edge gets the 3rd
if n % 2 == 0:
ec = []
for i in range(n):
ec.append(COLORS[i % 2])
else:
ec = [COLORS[i % 3] for i in range(n)]
# may not be proper for general n; let's adjust manually for n=6
if n == 6:
ec = [COLORS[0], COLORS[1], COLORS[0], COLORS[1], COLORS[0], COLORS[1]]
fig, ax = plt.subplots(figsize=(2.4, 2.4))
draw_graph(ax, pos, edges, edge_colors=ec)
ax.set_xlim(-1.3, 1.3); ax.set_ylim(-1.3, 1.3)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def fig_corona(filename, n=5):
"""Corona C_n ∘ K_1: cycle with one leaf attached to each vertex."""
pos = {}
for i in range(n):
pos[i] = (math.cos(2*math.pi*i/n + math.pi/2),
math.sin(2*math.pi*i/n + math.pi/2))
for i in range(n):
# leaf at radius 1.6
pos[n + i] = (1.65 * math.cos(2*math.pi*i/n + math.pi/2),
1.65 * math.sin(2*math.pi*i/n + math.pi/2))
cycle_edges = [(i, (i+1) % n) for i in range(n)]
leaf_edges = [(i, n + i) for i in range(n)]
edges = cycle_edges + leaf_edges
# Color the cycle as alternating (or for odd n, use 3 colors)
ec = []
if n % 2 == 0:
for i in range(n):
ec.append(COLORS[i % 2])
# Each leaf gets the 3rd color (since at each vertex cycle uses 2 colors)
for i in range(n):
ec.append(COLORS[2])
else:
# n=5: cycle needs 3 colors
# Use a manual valid coloring
ec = [COLORS[0], COLORS[1], COLORS[0], COLORS[1], COLORS[2]]
# Each leaf at vertex i gets the third color absent at vertex i
# Vertex 0: cycle edges colored COLORS[4-1=color of last edge] = COLORS[2], COLORS[0]; missing = COLORS[1]
# Hmm let me compute per vertex
cycle_color_at_vertex = [None] * n
for i, (u, v) in enumerate(cycle_edges):
cycle_color_at_vertex[u] = ec[i] if cycle_color_at_vertex[u] is None else (cycle_color_at_vertex[u], ec[i])
cycle_color_at_vertex[v] = ec[i] if cycle_color_at_vertex[v] is None else (cycle_color_at_vertex[v], ec[i])
# For vertex v: 2 cycle colors, leaf gets 3rd
leaf_color = []
for v in range(n):
used = set()
for i, (a, b) in enumerate(cycle_edges):
if v in (a, b):
used.add(ec[i])
third = [c for c in COLORS if c not in used][0]
leaf_color.append(third)
ec += leaf_color
fig, ax = plt.subplots(figsize=(3.6, 3.6))
draw_graph(ax, pos, edges, edge_colors=ec)
ax.set_xlim(-2.0, 2.0); ax.set_ylim(-2.0, 2.0)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def fig_star(filename):
"""Star K_{1,3} = central vertex + 3 leaves."""
pos = {0: (0, 0),
1: (1, 0),
2: (math.cos(2*math.pi/3), math.sin(2*math.pi/3)),
3: (math.cos(4*math.pi/3), math.sin(4*math.pi/3))}
edges = [(0, 1), (0, 2), (0, 3)]
ec = [COLORS[0], COLORS[1], COLORS[2]] # one of 3! = 6 proper colorings
fig, ax = plt.subplots(figsize=(2.4, 2.4))
draw_graph(ax, pos, edges, edge_colors=ec)
ax.set_xlim(-1.3, 1.3); ax.set_ylim(-1.3, 1.3)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def fig_blocktree(filename):
"""A subcubic outerplanar with block-cut tree structure: two cycles
glued at a cut vertex."""
pos = {
# left cycle (triangle)
0: (-2.0, 0.7),
1: (-2.0, -0.7),
2: (-1.0, 0.0),
# right cycle (4-cycle)
3: (-0.0, 0.7),
4: (1.0, 0.7),
5: (1.0, -0.7),
6: (0.0, -0.7),
}
# block 1 is a triangle 0-1-2; vertex 2 is the cut-vertex
edges_block1 = [(0, 1), (1, 2), (0, 2)]
# block 2 is a 4-cycle 2-3-4-5-6-2; oh wait vertex 2 should connect into it
# Let me redo: block 2 vertices are 2, 3, 4, 5, 6 forming a 5-cycle
pos[2] = (-1.0, 0.0)
pos[3] = (-0.3, 0.7)
pos[4] = (0.8, 0.7)
pos[5] = (0.8, -0.7)
pos[6] = (-0.3, -0.7)
edges_block2 = [(2, 3), (3, 4), (4, 5), (5, 6), (6, 2)]
edges = edges_block1 + edges_block2
# Proper 3-edge-coloring: tricky for triangle + 5-cycle
# Triangle: needs 3 distinct colors
# 5-cycle: 3-edge-coloring possible (3 colors arranged like 0-1-0-1-2 or similar)
# At cut vertex 2: incident to 2 edges from each block (triangle: 1-2 and 0-2; 5-cycle: 2-3 and 6-2)
# 2's incident edges: (0,2), (1,2), (2,3), (6,2) — 4 edges. Δ = 4!
# So this example has Δ=4 at vertex 2. Not subcubic.
# Let me redo with Δ ≤ 3.
# Maybe block 2 should be a triangle too, joined at a vertex.
# Triangle 0-1-2 + Triangle 2-3-4, sharing vertex 2.
pos = {
0: (-2.0, 0.7),
1: (-2.0, -0.7),
2: (-1.0, 0.0),
3: (0.0, 0.7),
4: (0.0, -0.7),
}
edges = [(0, 1), (1, 2), (0, 2),
(2, 3), (3, 4), (2, 4)]
# At vertex 2: 4 edges (1-2, 0-2, 2-3, 2-4) — STILL Δ=4!
# Two triangles sharing a vertex = bowtie; degree at shared vertex = 4. NOT subcubic.
# For subcubic + outerplanar with 2 cycle-blocks at a cut-vertex: impossible
# because the cut-vertex has degree >= 4 (2 from each block).
# So actually for subcubic outerplanar, cut-vertices can have AT MOST one
# cycle-block incident. i.e. 2 cycle-blocks share an EDGE (forming a single
# 2-connected block), not just a vertex.
# Let me instead show: a triangle with 3 pendants (corona-like) but as a
# tree-of-blocks: triangle + tree pendant.
pos = {
0: (-1.0, 0.7),
1: (-1.0, -0.7),
2: (0.0, 0.0),
3: (1.0, 0.5),
4: (1.6, 1.0),
5: (1.0, -0.5),
6: (1.6, -1.0),
}
edges = [(0, 1), (1, 2), (0, 2), # triangle block
(2, 3), (3, 4), # tree pendant 1
(2, 5), (5, 6)] # tree pendant 2
# NOW: deg at 2 = 4. Still not Δ ≤ 3.
# Hmm. Triangle + 2 pendants at one vertex: 2+2 = 4 at shared vertex.
# For subcubic: at most 1 pendant at any triangle vertex.
pos = {
0: (-1.0, 0.7),
1: (-1.0, -0.7),
2: (0.0, 0.0),
3: (1.0, 0.0),
4: (2.0, 0.5),
5: (2.0, -0.5),
}
edges = [(0, 1), (1, 2), (0, 2), # triangle
(2, 3), # pendant edge to 3
(3, 4), (3, 5)] # 3 branches into 2 leaves
# vertex 2 degree: 3 (to 0, 1, 3). ✓
# vertex 3 degree: 3 (to 2, 4, 5). ✓
# All others ≤ 2. So Δ = 3. ✓
# And it's outerplanar (planar with all vertices on outer face).
ec = [COLORS[0], COLORS[1], COLORS[2], # triangle: 3 distinct colors
COLORS[0], # 2-3
COLORS[1], COLORS[2]] # 3-4, 3-5 (must differ from 2-3 and each other)
fig, ax = plt.subplots(figsize=(5.0, 2.4))
draw_graph(ax, pos, edges, edge_colors=ec)
ax.set_xlim(-1.6, 2.5); ax.set_ylim(-1.2, 1.2)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def fig_theta(filename):
"""Theta graph theta(2,2,2) = K_{2,3}: outside the menagerie because
not outerplanar (contains K_{2,3} = itself). Drawn in red as a
counterexample."""
pos = {
0: (-1.0, 0.0),
1: (1.0, 0.0),
2: (0.0, 0.8),
3: (0.0, 0.0),
4: (0.0, -0.8),
}
edges = [(0, 2), (2, 1),
(0, 3), (3, 1),
(0, 4), (4, 1)]
# Color in muted gray-red, no specific edge coloring
ec = ['#aa4444'] * len(edges)
fig, ax = plt.subplots(figsize=(3.4, 2.4))
draw_graph(ax, pos, edges, edge_colors=ec, vertex_color='#aa4444')
ax.set_xlim(-1.5, 1.5); ax.set_ylim(-1.3, 1.3)
ax.set_aspect('equal'); ax.axis('off')
plt.savefig(filename, dpi=160, bbox_inches='tight')
plt.close()
def main():
out_dir = HERE
fig_path(os.path.join(out_dir, 'fig_path.png'), n=5)
fig_cycle(os.path.join(out_dir, 'fig_cycle.png'), n=6)
fig_corona(os.path.join(out_dir, 'fig_corona.png'), n=5)
fig_star(os.path.join(out_dir, 'fig_star.png'))
fig_blocktree(os.path.join(out_dir, 'fig_blocktree.png'))
fig_theta(os.path.join(out_dir, 'fig_theta.png'))
print(f"Wrote figures to {out_dir}")
if __name__ == '__main__':
main()
@@ -0,0 +1,2 @@
\relax
\gdef \@abspage@last{4}
@@ -0,0 +1,332 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 25 MAY 2026 21:05
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**menagerie.tex
(./menagerie.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-24>
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/size11.clo
File: size11.clo 2021/10/04 v1.4n Standard LaTeX file (size option)
)
\c@part=\count185
\c@section=\count186
\c@subsection=\count187
\c@subsubsection=\count188
\c@paragraph=\count189
\c@subparagraph=\count190
\c@figure=\count191
\c@table=\count192
\abovecaptionskip=\skip47
\belowcaptionskip=\skip48
\bibindent=\dimen138
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsmath.sty
Package: amsmath 2021/10/15 v2.17l AMS math features
\@mathmargin=\skip49
For additional information on amsmath, use the `?' option.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amstext.sty
Package: amstext 2021/08/26 v2.01 AMS text
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsgen.sty
File: amsgen.sty 1999/11/30 v2.0 generic functions
\@emptytoks=\toks16
\ex@=\dimen139
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsbsy.sty
Package: amsbsy 1999/11/29 v1.2d Bold Symbols
\pmbraise@=\dimen140
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty
Package: amsopn 2021/08/26 v2.02 operator names
)
\inf@bad=\count193
LaTeX Info: Redefining \frac on input line 234.
\uproot@=\count194
\leftroot@=\count195
LaTeX Info: Redefining \overline on input line 399.
\classnum@=\count196
\DOTSCASE@=\count197
LaTeX Info: Redefining \ldots on input line 496.
LaTeX Info: Redefining \dots on input line 499.
LaTeX Info: Redefining \cdots on input line 620.
\Mathstrutbox@=\box50
\strutbox@=\box51
\big@size=\dimen141
LaTeX Font Info: Redeclaring font encoding OML on input line 743.
LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
\macc@depth=\count198
\c@MaxMatrixCols=\count199
\dotsspace@=\muskip16
\c@parentequation=\count266
\dspbrk@lvl=\count267
\tag@help=\toks17
\row@=\count268
\column@=\count269
\maxfields@=\count270
\andhelp@=\toks18
\eqnshift@=\dimen142
\alignsep@=\dimen143
\tagshift@=\dimen144
\tagwidth@=\dimen145
\totwidth@=\dimen146
\lineht@=\dimen147
\@envbody=\toks19
\multlinegap=\skip50
\multlinetaggap=\skip51
\mathdisplay@stack=\toks20
LaTeX Info: Redefining \[ on input line 2938.
LaTeX Info: Redefining \] on input line 2939.
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amssymb.sty
Package: amssymb 2013/01/14 v3.01 AMS font symbols
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amsfonts.sty
Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
\symAMSa=\mathgroup4
\symAMSb=\mathgroup5
LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
(Font) U/euf/m/n --> U/euf/b/n on input line 106.
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsthm.sty
Package: amsthm 2020/05/29 v2.20.6
\thm@style=\toks21
\thm@bodyfont=\toks22
\thm@headfont=\toks23
\thm@notefont=\toks24
\thm@headpunct=\toks25
\thm@preskip=\skip52
\thm@postskip=\skip53
\thm@headsep=\skip54
\dth@everypar=\toks26
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphicx.sty
Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/keyval.sty
Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
\KV@toks@=\toks27
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphics.sty
Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/trig.sty
Package: trig 2021/08/11 v1.11 sin cos tan (DPC)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
)
Package graphics Info: Driver file: pdftex.def on input line 107.
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-def/pdftex.def
File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
))
\Gin@req@height=\dimen148
\Gin@req@width=\dimen149
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/geometry/geometry.sty
Package: geometry 2020/01/02 v5.9 Page Geometry
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/ifvtex.sty
Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty
Package: iftex 2022/02/03 v1.0f TeX engine tests
))
\Gm@cnth=\count271
\Gm@cntv=\count272
\c@Gm@tempcnt=\count273
\Gm@bindingoffset=\dimen150
\Gm@wd@mp=\dimen151
\Gm@odd@mp=\dimen152
\Gm@even@mp=\dimen153
\Gm@layoutwidth=\dimen154
\Gm@layoutheight=\dimen155
\Gm@layouthoffset=\dimen156
\Gm@layoutvoffset=\dimen157
\Gm@dimlist=\toks28
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption.sty
Package: caption 2022/03/01 v3.6b Customizing captions (AR)
(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption3.sty
Package: caption3 2022/03/17 v2.3b caption3 kernel (AR)
\caption@tempdima=\dimen158
\captionmargin=\dimen159
\caption@leftmargin=\dimen160
\caption@rightmargin=\dimen161
\caption@width=\dimen162
\caption@indent=\dimen163
\caption@parindent=\dimen164
\caption@hangindent=\dimen165
Package caption Info: Standard document class detected.
)
\c@caption@flags=\count274
\c@continuedfloat=\count275
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/subcaption.sty
Package: subcaption 2022/01/07 v1.5 Sub-captions (AR)
\c@subfigure=\count276
\c@subtable=\count277
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX)
\l__color_backend_stack_int=\count278
\l__pdf_internal_box=\box52
)
(./menagerie.aux)
\openout1 = `menagerie.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 16.
LaTeX Font Info: ... okay on input line 16.
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count279
\scratchdimen=\dimen166
\scratchbox=\box53
\nofMPsegments=\count280
\nofMParguments=\count281
\everyMPshowfont=\toks29
\MPscratchCnt=\count282
\MPscratchDim=\dimen167
\MPnumerator=\count283
\makeMPintoPDFobject=\count284
\everyMPtoPDFconversion=\toks30
) (/usr/local/texlive/2022/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
85.
(/usr/local/texlive/2022/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
e
))
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
*geometry* verbose mode - [ preamble ] result:
* driver: pdftex
* paper: <default>
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes:
* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
* \paperwidth=614.295pt
* \paperheight=794.96999pt
* \textwidth=469.75502pt
* \textheight=650.43001pt
* \oddsidemargin=0.0pt
* \evensidemargin=0.0pt
* \topmargin=-37.0pt
* \headheight=12.0pt
* \headsep=25.0pt
* \topskip=11.0pt
* \footskip=30.0pt
* \marginparwidth=59.0pt
* \marginparsep=10.0pt
* \columnsep=10.0pt
* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
* \hoffset=0.0pt
* \voffset=0.0pt
* \mag=1000
* \@twocolumnfalse
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)
Package caption Info: Begin \AtBeginDocument code.
Package caption Info: End \AtBeginDocument code.
LaTeX Font Info: Trying to load font information for U+msa on input line 17.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
)
LaTeX Font Info: Trying to load font information for U+msb on input line 17.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
<fig_path.png, id=1, 249.3315pt x 61.4295pt>
File: fig_path.png Graphic file (type png)
<use fig_path.png>
Package pdftex.def Info: fig_path.png used on input line 36.
(pdftex.def) Requested size: 258.36668pt x 63.66019pt.
<fig_cycle.png, id=3, 147.70181pt x 147.70181pt>
File: fig_cycle.png Graphic file (type png)
<use fig_cycle.png>
Package pdftex.def Info: fig_cycle.png used on input line 51.
(pdftex.def) Requested size: 150.32504pt x 150.33832pt.
[1
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./fig_p
ath.png> <./fig_cycle.png>]
<fig_star.png, id=22, 147.70181pt x 147.70181pt>
File: fig_star.png Graphic file (type png)
<use fig_star.png>
Package pdftex.def Info: fig_star.png used on input line 65.
(pdftex.def) Requested size: 117.43875pt x 117.44266pt.
<fig_corona.png, id=23, 214.55156pt x 214.55156pt>
File: fig_corona.png Graphic file (type png)
<use fig_corona.png>
Package pdftex.def Info: fig_corona.png used on input line 76.
(pdftex.def) Requested size: 197.29623pt x 197.29816pt.
[2 <./fig_star.png> <./fig_corona.png>]
<fig_blocktree.png, id=29, 242.55618pt x 147.70181pt>
File: fig_blocktree.png Graphic file (type png)
<use fig_blocktree.png>
Package pdftex.def Info: fig_blocktree.png used on input line 122.
(pdftex.def) Requested size: 258.36668pt x 157.34296pt.
<fig_theta.png, id=30, 168.47943pt x 147.70181pt>
File: fig_theta.png Graphic file (type png)
<use fig_theta.png>
Package pdftex.def Info: fig_theta.png used on input line 146.
(pdftex.def) Requested size: 150.32504pt x 131.79225pt.
[3 <./fig_blocktree.png>] [4 <./fig_theta.png>] (./menagerie.aux) )
Here is how much of TeX's memory you used:
4626 strings out of 478268
75252 string characters out of 5846347
370157 words of memory out of 5000000
22807 multiletter control sequences out of 15000+600000
478664 words of font info for 64 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,6n,63p,245b,198s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local
/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/local/
texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/local/t
exlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/local/te
xlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></usr/local/tex
live/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/local/texli
ve/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/local/texlive
/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/local/texlive/2
022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb></usr/local/texlive/202
2/texmf-dist/fonts/type1/public/amsfonts/cm/cmr6.pfb></usr/local/texlive/2022/t
exmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/local/texlive/2022/texm
f-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/local/texlive/2022/texmf
-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/local/texlive/2022/texmf-d
ist/fonts/type1/public/amsfonts/cm/cmti10.pfb>
Output written on menagerie.pdf (4 pages, 197957 bytes).
PDF statistics:
95 PDF objects out of 1000 (max. 8388607)
50 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
31 words of extra memory for PDF output out of 10000 (max. 10000000)
@@ -0,0 +1,159 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{caption}
\usepackage{subcaption}
\geometry{margin=1in}
\title{Edge $3$-colorings of small outerplanar graphs with $\Delta\leq3$:\\
a menagerie}
\author{}
\date{}
\newtheorem*{prop}{Proposition}
\begin{document}
\maketitle
\section*{Setup}
For a graph $G$ write $P_e(G,k)$ for the number of proper $k$-edge-colorings of
$G$ (= the chromatic polynomial of the line graph $L(G)$ evaluated at $k$).
Throughout this note $\Delta(G)$ denotes the maximum degree of $G$; we are
interested in $k=3$ and $\Delta(G)\le3$, with $G$ outerplanar.
There is no \emph{universal} closed form for $P_e(G,3)$ on the class of
subcubic outerplanar graphs, but the class is small enough that every $G$ in
it decomposes along its block--cut tree into building blocks each of which
admits a closed-form count. The building blocks form a short menagerie.
\section*{The menagerie}
\subsection*{1.~Path $P_n$ \;($n$ vertices, $n-1$ edges; $\Delta\le 2$)}
\begin{center}
\includegraphics[width=0.55\textwidth]{fig_path.png}
\end{center}
The line graph $L(P_n)$ is the path $P_{n-1}$, so
\[
P_e(P_n,k) \;=\; P_{\text{vert}}(P_{n-1},k) \;=\; k(k-1)^{n-2},
\qquad
P_e(P_n,3) \;=\; 3\cdot 2^{n-2}.
\]
(For a single edge, $n=2$, the count is $3$; for two edges in a row, $n=3$,
the count is $6$.)
\subsection*{2.~Cycle $C_n$ \;($\Delta=2$)}
\begin{center}
\includegraphics[width=0.32\textwidth]{fig_cycle.png}
\end{center}
The line graph $L(C_n)=C_n$, so
\[
P_e(C_n,k) \;=\; (k-1)^n + (-1)^n(k-1),
\qquad
P_e(C_n,3) \;=\; 2^n + 2(-1)^n.
\]
For even $n$ the count is $2^n+2$; for odd $n$ it is $2^n-2$.
\subsection*{3.~Star $K_{1,3}$ \;(a single $\Delta=3$ vertex)}
\begin{center}
\includegraphics[width=0.25\textwidth]{fig_star.png}
\end{center}
Three pairwise-incident edges at a single vertex must carry three distinct
colors, so $P_e(K_{1,3},3) = 3! = 6$. More generally
$P_e(K_{1,d},k) = k(k-1)\cdots(k-d+1)$, which is positive iff $k\ge d$, i.e.\
iff $k\ge\Delta(G)$.
\subsection*{4.~Corona $C_n\circ K_1$ \;(cycle with one leaf per cycle vertex; $\Delta=3$)}
\begin{center}
\includegraphics[width=0.42\textwidth]{fig_corona.png}
\end{center}
Each cycle vertex $v$ has degree $3$ in $C_n\circ K_1$: its two cycle edges
must carry distinct colors and its leaf must carry the unique remaining third
color. So the leaf coloring is \emph{forced} by the cycle coloring, and
\[
P_e(C_n\circ K_1,\,3) \;=\; P_e(C_n,3) \;=\; 2^n + 2(-1)^n.
\]
This is the form of the partial tire dual $D(T)$ in the spoke-only case
(with $L=n+m$).
\subsection*{5.~Trees with $\Delta\le 3$}
A tree $T$ on $n$ vertices has $|E(T)|=n-1$ edges; its line graph $L(T)$ is
a \emph{block graph} (every block is a clique). Edge-color a tree greedily
by processing edges in BFS order from a leaf: when an edge $\{u,v\}$ is added,
the only colors forbidden are those already used on the edges incident to its
already-colored endpoint. Hence at any vertex of degree $d$, when the $d$-th
edge is added there are exactly $k-(d-1)$ choices. For $k=3$ and $\Delta\le3$:
\[
P_e(T,3) \;=\; 3\prod_{e\in E(T)\setminus\{e_0\}} (3-d_e),
\]
where $e_0$ is the first edge processed and $d_e$ is the number of already-
processed edges incident to the new endpoint of $e$ (between $1$ and $2$, since
$\Delta\le 3$). In practice this gives a clean product depending only on the
degree sequence of $T$.
\subsection*{6.~Two-connected outerplanar with $\Delta=3$ is just $C_n$}
The only $2$-connected outerplanar graphs are polygons (with optional chords).
Each chord adds a degree to each of its two endpoints; if every vertex on the
polygon $C_n$ already has degree $2$ from the cycle, then we may add at most
one chord-endpoint per vertex, so chords must form a matching. Already a
\emph{single} chord on a $2$-connected outerplanar graph forces both
endpoints to degree $3$. In particular, the only $2$-connected outerplanar
graph with $\Delta\le 3$ in which the maximum is actually attained at
\emph{every} vertex would be a polygon with a perfect matching of chords;
but each chord crosses some other (mod the planar embedding) unless the two
matched vertices are adjacent on the polygon, which collapses the
``$2$-connected'' assumption. The upshot is: \emph{the $2$-connected blocks
in our class are just cycles.}
\subsection*{7.~Block--cut decomposition}
\begin{center}
\includegraphics[width=0.55\textwidth]{fig_blocktree.png}
\end{center}
A general subcubic outerplanar graph is a union of cycle-blocks and edge-blocks
glued at cut vertices. By case~6 each $2$-connected block is a cycle; the
remaining blocks are single edges (i.e.\ tree edges). At a cut vertex $v$ of
degree $d_v\in\{2,3\}$, the colors of the $d_v$ edges incident to $v$ must be
pairwise distinct. Counting $P_e(G,3)$ for the whole graph $G$ amounts to
counting colorings of each block independently and then enforcing the
distinct-color constraint at every cut vertex. For $k=3$ and $\Delta\le3$
this gives
\[
P_e(G,3) \;=\; \prod_{B \text{ cycle block of }G} P_e(B,3) \;\cdot\;
\prod_{B \text{ edge block of }G} P_e(B,3)
\;/\; \prod_{v\text{ cut vertex}} (\text{normalization at } v),
\]
where the normalization corrects the over- or under-counting at the
cut-vertex constraint. For each cycle-block $B = C_n$ contributing
$2^n + 2(-1)^n$ proper $3$-edge-colorings, and each edge-block contributing
$3$, this product is computable in time linear in $|V(G)|+|E(G)|$.
\section*{Outside the menagerie: theta graphs}
\begin{center}
\includegraphics[width=0.32\textwidth]{fig_theta.png}
\end{center}
The complete bipartite graph $K_{2,3}$, equivalently the theta graph
$\theta(2,2,2)$, is \emph{not} outerplanar (it is a forbidden minor for
outerplanarity). In our tire-graph application this is the structure of the
interior dual subgraph of $D(T)$ when the inner outerplanar graph $O$ has a
bridge: two trivalent vertices $d_f$ connected by three internally
vertex-disjoint paths. Such a $D(T)$ falls outside the simple block-cut
menagerie above and its $P_e(\cdot,3)$ does not reduce to a product over
cycle-blocks; instead it is computed directly by deletion--contraction on the
theta-graph structure, or via a transfer matrix on the three paths.
\end{document}