coloring_nested_tire_graphs: cut-and-depth-label procedure with Holton-McKay #0 example

Adds a new note describing a cut-and-depth-label procedure for
the dual G' of a maximal planar G:

  1. Find a 6-edge cut C in G'.
  2. Remove cut edges → G'_0, G'_1.
  3. In each G'_i:
     a. V_i = degree-2 vertices (vertices incident to exactly 1
        cut edge, hence degree 3-1=2 in induced subgraph).
     b. For each v ∈ V_i, add a pendant edge to a new vertex.
        Label pendants depth 0.
     c. BFS-propagate: edges adjacent to a depth-d edge get
        depth d+1, until all edges are labelled.

Worked example on Holton-McKay graph #0 (38-vertex non-Hamiltonian
cubic plane graph, dual of a 21-vertex triangulation):

  - 128 distinct 6-edge cuts found by greedy search.
  - Best matching cut: |S| = 10, cut = 6 edges with 12 distinct
    endpoints (6 per side).
  - G'_0: 10 + 6 = 16 vertices, max depth 2.
  - G'_1: 28 + 6 = 34 vertices, max depth 7.

The procedure mirrors the 4CT cut-and-reglue reducibility scheme:
each G'_i has pendants restoring cubicity at the boundary; the
depth labels organize G'_i into concentric layers by distance to
the cut. This is the dual analogue of plane depth from a level
cycle (cf. the level-cycle generalization discussion).

Files:
  experiments/cut_depth_label.py
  notes/cut_depth_label.tex (3 pages)
  notes/fig_cut_depth_label.png

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 15:00:42 -04:00
parent 82f58f2f88
commit d9748e38d9
6 changed files with 786 additions and 0 deletions
@@ -0,0 +1,283 @@
"""Cut-and-depth-label procedure on a Holton-McKay graph.
Procedure:
1. Take G' (we use a Holton-McKay non-Hamiltonian 38-vertex cubic
plane graph, viewed as the dual of a 21-vertex triangulation G).
2. Find 6 cut edges of G' whose removal disconnects it into two
non-trivial cubic-minus-boundary pieces G'_0 and G'_1.
3. In each G'_i:
a. V_i = vertices of degree 2 (the 6 endpoints in G'_i of cut
edges).
b. For each v ∈ V_i, add a new pendant edge to a new vertex.
Label these pendant edges depth 0.
c. BFS-propagate: for d = 0, 1, ..., label every edge sharing
a vertex with a depth-d edge (and not yet labelled) as
depth d + 1.
d. Stop when every edge has a depth label.
4. Render G'_0 and G'_1 with edges coloured by depth.
"""
import os
import sys
from collections import deque, defaultdict
import math
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
from sage.all import Graph
HM_FILE = ('/Users/didericis/Code/math-research/papers/'
'even_level_graph_generators/experiments/nonham38m4.pc')
def parse_planar_code(path):
with open(path, 'rb') as f:
data = f.read()
header = b'>>planar_code<<'
assert data.startswith(header), data[:20]
pos = len(header)
sage_graphs = []
while pos < len(data):
n = data[pos]; pos += 1
edges = set()
for v in range(n):
while True:
w = data[pos]; pos += 1
if w == 0:
break
edges.add(frozenset((v, w - 1)))
G = Graph([tuple(e) for e in edges], multiedges=False, loops=False)
G.is_planar(set_embedding=True)
sage_graphs.append(G)
return sage_graphs
def find_six_edge_cut(G, prefer_balanced=True, prefer_matching=True):
"""Find a 6-edge cut: a set of 6 edges whose removal yields two
non-trivial components.
For a cubic graph: edges between S and complement
= 3|S| - 2 * e(S). We want this to equal 6.
Search strategy: BFS-grow a vertex set S from each possible start,
track the boundary edge count. Collect all sizes that yield a
6-edge cut. Return the best one according to:
prefer_matching: cut is a "matching cut" (each boundary vertex
has exactly one cut edge).
prefer_balanced: |S| closest to n/2.
"""
n = G.order()
candidates = []
for start in G.vertices():
S = {start}
boundary = 3
# BFS-grow; at each step pick the frontier vertex that adds the
# most internal edges (reduces boundary).
prev_size = -1
while True:
if boundary == 6 and 2 <= len(S) <= n - 2:
cut = [(u, v) for u in S
for v in G.neighbors(u) if v not in S]
if len(cut) == 6:
candidates.append((frozenset(S), cut))
if len(S) == prev_size:
break
prev_size = len(S)
# frontier
frontier = []
for w in G.vertices():
if w in S: continue
if any(nb in S for nb in G.neighbors(w)):
edges_into_S = sum(1 for nb in G.neighbors(w) if nb in S)
frontier.append((edges_into_S, w))
if not frontier:
break
frontier.sort(reverse=True)
_, w = frontier[0]
edges_into_S = sum(1 for nb in G.neighbors(w) if nb in S)
S.add(w)
boundary = boundary + 3 - 2 * edges_into_S
if len(S) >= n - 1:
break
if not candidates:
return None, None
# Pick best: prefer matching cuts (both sides have 6 distinct
# boundary vertices = 6 cut edges form a matching).
def score(item):
S, cut = item
endpoints_in_S = [u for (u, v) in cut if u in S] + \
[v for (u, v) in cut if v in S]
endpoints_in_Sc = [u for (u, v) in cut if u not in S] + \
[v for (u, v) in cut if v not in S]
is_matching = (len(set(endpoints_in_S)) == 6 and
len(set(endpoints_in_Sc)) == 6)
# Distinctness within each side
deg2_S = len(set(endpoints_in_S))
deg2_Sc = len(set(endpoints_in_Sc))
balance = abs(len(S) - n / 2)
# Prefer maximum total V coverage, then matching, then balanced
return (-(deg2_S + deg2_Sc), -int(is_matching), balance)
candidates.sort(key=score)
# Dedupe identical S sets
seen = set()
unique = []
for S, cut in candidates:
if S in seen: continue
seen.add(S)
unique.append((S, cut))
print(f' Found {len(unique)} distinct 6-edge cuts')
return unique[0]
def apply_procedure(G, S, cut, side_label='0'):
"""Build G'_i from G[S] plus pendant edges at degree-2 vertices.
Per the user's procedure:
a. V = vertices of degree 2 in the induced subgraph (i.e.,
original cubic vertices that have exactly 1 cut edge,
hence degree 3 - 1 = 2 in the induced subgraph).
b. Add 1 pendant edge per v in V.
c. Label pendants depth 0, BFS-propagate.
Returns (graph, pos, edge_depths, deg2_vertices, pendant_map,
high_deg_loss). high_deg_loss tracks vertices with >= 2 cut
edges that don't receive pendants under the strict procedure.
"""
induced_edges = [(u, v) for (u, v) in G.edges(labels=False)
if u in S and v in S]
H = Graph(induced_edges, multiedges=False, loops=False)
# Ensure all vertices of S are present (some may be isolated)
for v in S:
H.add_vertex(v)
# Compute degree of each vertex in induced subgraph
induced_deg = {v: H.degree(v) for v in S}
# V = degree-2 vertices
V_deg2 = sorted([v for v in S if induced_deg[v] == 2])
high_loss = sorted([v for v in S if induced_deg[v] < 2])
pendant_edges = []
next_pendant_id = (max(G.vertices()) + 1)
pendant_to_boundary = {}
for v in V_deg2:
H.add_edge(v, next_pendant_id)
pendant_edges.append((min(v, next_pendant_id),
max(v, next_pendant_id)))
pendant_to_boundary[next_pendant_id] = v
next_pendant_id += 1
# BFS-label edges by depth
edge_depth = {}
queue = deque()
for e in pendant_edges:
edge_depth[e] = 0
queue.append((e, 0))
while queue:
(u, v), d = queue.popleft()
# adjacent edges share vertex u or v
for endpoint in (u, v):
for nb in H.neighbors(endpoint):
e_nb = (min(endpoint, nb), max(endpoint, nb))
if e_nb == (u, v): continue
if e_nb not in edge_depth:
edge_depth[e_nb] = d + 1
queue.append((e_nb, d + 1))
# Layout: use Sage's planar embedding
pos = H.layout(layout='planar') if H.is_planar() else H.layout()
return H, pos, edge_depth, V_deg2, pendant_to_boundary, high_loss
def draw_labeled_graph(ax, H, pos, edge_depth, boundary_vertices,
pendant_to_boundary, title):
max_depth = max(edge_depth.values()) if edge_depth else 0
cmap = plt.get_cmap('viridis', max_depth + 1)
# Draw edges by depth
legend_handles = []
for d in range(max_depth + 1):
color = cmap(d / max(max_depth, 1))
for e, ed in edge_depth.items():
if ed != d: continue
u, v = e
(x1, y1) = pos[u]
(x2, y2) = pos[v]
ax.plot([x1, x2], [y1, y2], color=color,
linewidth=2.0 + (1.5 if d == 0 else 0),
linestyle=('--' if d == 0 else '-'),
zorder=1)
legend_handles.append(
plt.Line2D([], [], color=color, linewidth=2.5,
linestyle='--' if d == 0 else '-',
label=f'depth {d}')
)
# Draw vertices
for v, (x, y) in pos.items():
if v in pendant_to_boundary:
ax.plot(x, y, 's', color='#ffaa66', markersize=8, zorder=2,
markeredgecolor='#aa5500')
elif v in boundary_vertices:
ax.plot(x, y, 'o', color='#ff5555', markersize=10, zorder=2,
markeredgecolor='#aa0000')
else:
ax.plot(x, y, 'o', color='#888', markersize=6, zorder=2)
ax.set_aspect('equal')
ax.axis('off')
ax.set_title(title, fontsize=11)
ax.legend(handles=legend_handles, loc='upper left',
bbox_to_anchor=(1.02, 1.0), fontsize=8, frameon=False)
def main():
here = os.path.dirname(os.path.abspath(__file__))
out = os.path.normpath(os.path.join(here, '..', 'notes',
'fig_cut_depth_label.png'))
gs = parse_planar_code(HM_FILE)
print(f'Loaded {len(gs)} Holton-McKay graphs')
# Pick the first one
G = gs[0]
print(f'Graph 0: {G.order()} vertices, {G.size()} edges, '
f'cubic={all(d == 3 for d in G.degree())}, planar={G.is_planar()}')
# Find a 6-edge cut
S, cut = find_six_edge_cut(G)
if S is None:
print('No 6-edge cut found by greedy search.')
return
print(f'Found 6-edge cut: |S| = {len(S)}, |cut| = {len(cut)}')
print(f'Cut edges: {cut}')
S0 = frozenset(S)
S1 = frozenset(G.vertices()) - S0
H0, pos0, ed0, bv0, pmap0, hl0 = apply_procedure(G, S0, cut, '0')
H1, pos1, ed1, bv1, pmap1, hl1 = apply_procedure(G, S1, cut, '1')
print(f"G'_0: {H0.order()} vertices ({len(S0)} original + "
f'{len(pmap0)} pendant), {H0.size()} edges')
print(f" V (degree-2 vertices receiving pendants): {len(bv0)} vertices")
print(f" Multi-cut vertices not in V: {hl0}")
print(f' Max depth: {max(ed0.values())}')
print(f"G'_1: {H1.order()} vertices ({len(S1)} original + "
f'{len(pmap1)} pendant), {H1.size()} edges')
print(f" V (degree-2 vertices receiving pendants): {len(bv1)} vertices")
print(f" Multi-cut vertices not in V: {hl1}")
print(f' Max depth: {max(ed1.values())}')
# Draw
fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(16, 8.0))
draw_labeled_graph(ax0, H0, pos0, ed0, bv0, pmap0,
f"$G'_0$ (|S| = {len(S0)}, |V| = {len(bv0)}, "
f"max depth = {max(ed0.values())})")
draw_labeled_graph(ax1, H1, pos1, ed1, bv1, pmap1,
f"$G'_1$ (|S| = {len(S1)}, |V| = {len(bv1)}, "
f"max depth = {max(ed1.values())})")
fig.suptitle("Cut-and-depth-label procedure on Holton-McKay graph #0 "
"(38 vertices, cubic, planar, non-Hamiltonian)\n"
"Dashed orange = pendant edges (depth 0); colored by "
"BFS depth from pendants in line-graph sense",
fontsize=11, y=1.00)
plt.tight_layout()
plt.savefig(out, dpi=160, bbox_inches='tight')
plt.close()
print(f'Wrote {out}')
if __name__ == '__main__':
main()
@@ -0,0 +1,8 @@
\relax
\@writefile{toc}{\contentsline {paragraph}{The chosen 6-edge cut.}{1}{}\protected@file@percent }
\@writefile{toc}{\contentsline {paragraph}{Resulting half-graphs.}{2}{}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Cut-and-depth-label procedure on Holton-McKay graph \#0 ($38$ vertices, $57$ edges, cubic planar non-Hamiltonian). The $6$-edge matching cut splits $G'$ into a $10$-vertex piece $G'_0$ (left) and a $28$-vertex piece $G'_1$ (right). Pendant edges (dashed, dark purple) are at depth $0$; the colour gradient encodes depth $0$ through max depth via BFS in the line-graph sense. Orange squares are the new pendant vertices; red circles are the boundary vertices in $V_i$; gray circles are interior vertices.\relax }}{2}{}\protected@file@percent }
\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}}
\newlabel{fig:cut-depth-label}{{1}{2}}
\@writefile{toc}{\contentsline {paragraph}{Visualization.}{2}{}\protected@file@percent }
\gdef \@abspage@last{3}
@@ -0,0 +1,332 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 15:00
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**cut_depth_label.tex
(./cut_depth_label.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/booktabs/booktabs.sty
Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
\heavyrulewidth=\dimen158
\lightrulewidth=\dimen159
\cmidrulewidth=\dimen160
\belowrulesep=\dimen161
\belowbottomsep=\dimen162
\aboverulesep=\dimen163
\abovetopsep=\dimen164
\cmidrulesep=\dimen165
\cmidrulekern=\dimen166
\defaultaddspace=\dimen167
\@cmidla=\count274
\@cmidlb=\count275
\@aboverulesep=\dimen168
\@belowrulesep=\dimen169
\@thisruleclass=\count276
\@lastruleclass=\count277
\@thisrulewidth=\dimen170
)
(/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=\dimen171
\captionmargin=\dimen172
\caption@leftmargin=\dimen173
\caption@rightmargin=\dimen174
\caption@width=\dimen175
\caption@indent=\dimen176
\caption@parindent=\dimen177
\caption@hangindent=\dimen178
Package caption Info: Standard document class detected.
)
\c@caption@flags=\count278
\c@continuedfloat=\count279
)
(/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=\count280
\l__pdf_internal_box=\box52
)
(./cut_depth_label.aux)
\openout1 = `cut_depth_label.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 17.
LaTeX Font Info: ... okay on input line 17.
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count281
\scratchdimen=\dimen179
\scratchbox=\box53
\nofMPsegments=\count282
\nofMParguments=\count283
\everyMPshowfont=\toks29
\MPscratchCnt=\count284
\MPscratchDim=\dimen180
\MPnumerator=\count285
\makeMPintoPDFobject=\count286
\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 18.
(/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 18.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
Overfull \hbox (31.88051pt too wide) in paragraph at lines 65--70
\OT1/cmr/m/n/10.95 Holton and McKay (loaded from \OT1/cmtt/m/n/10.95 papers/eve
n[]level[]graph[]generators/experiments/nonham38m4.pc\OT1/cmr/m/n/10.95 ).
[]
[1
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
<fig_cut_depth_label.png, id=17, 1150.44806pt x 565.06107pt>
File: fig_cut_depth_label.png Graphic file (type png)
<use fig_cut_depth_label.png>
Package pdftex.def Info: fig_cut_depth_label.png used on input line 108.
(pdftex.def) Requested size: 469.75502pt x 230.7281pt.
Overfull \hbox (46.78696pt too wide) in paragraph at lines 123--130
\OT1/cmr/m/n/10.95 The pro-ce-dure mir-rors the $4$CT cut-and-reglue scheme (\O
T1/cmtt/m/n/10.95 rainbow[]proof.tex\OT1/cmr/m/n/10.95 , \OT1/cmtt/m/n/10.95 wo
rst[]case[]proof[]sketch.tex\OT1/cmr/m/n/10.95 ,
[]
[2 <./fig_cut_depth_label.png>] [3] (./cut_depth_label.aux) )
Here is how much of TeX's memory you used:
4579 strings out of 478268
74295 string characters out of 5846347
370409 words of memory out of 5000000
22760 multiletter control sequences out of 15000+600000
479174 words of font info for 66 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,8n,63p,656b,312s stack positions out of 10000i,1000n,20000p,200000b,200000s
{/usr/local/texliv
e/2022/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/local/texlive
/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/local/texlive/
2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2
022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/local/texlive/20
22/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/local/texlive/2022
/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/local/texlive/2022/t
exmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb></usr/local/texlive/2022/tex
mf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/local/texlive/2022/texmf-
dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/local/texlive/2022/texmf-d
ist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/local/texlive/2022/texmf-dis
t/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/local/texlive/2022/texmf-dist
/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/local/texlive/2022/texmf-dist/
fonts/type1/public/cm-super/sfrm1095.pfb>
Output written on cut_depth_label.pdf (3 pages, 357384 bytes).
PDF statistics:
78 PDF objects out of 1000 (max. 8388607)
46 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
6 words of extra memory for PDF output out of 10000 (max. 10000000)
@@ -0,0 +1,163 @@
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{booktabs}
\usepackage{caption}
\geometry{margin=1in}
\title{Cut-and-depth-label: a procedure for labelling half-graphs of\\
a $6$-edge cut by ``distance to the cut''}
\author{}
\date{}
\newtheorem*{obs}{Observation}
\newtheorem*{prop}{Proposition}
\begin{document}
\maketitle
\section*{Procedure}
Given a maximal planar graph $G$ and its dual $G'$:
\begin{enumerate}
\item Find a $6$-edge cut $C \subseteq E(G')$ partitioning
$V(G')$ into $S$ and $V \setminus S$ with both sides
non-empty.
\item Remove the cut edges to obtain two graphs
$G'_0 := G'[S] \cup \emptyset_C$ and
$G'_1 := G'[V \setminus S] \cup \emptyset_C$ (each a cubic
graph minus boundary edges).
\item In each $G'_i$:
\begin{enumerate}
\item Let $V_i$ be the set of vertices of degree $2$ in
$G'_i$ (i.e.\ original cubic vertices incident to
exactly one cut edge; the cut edge accounts for the
missing edge, so the vertex sits at degree $3 - 1 =
2$).
\item For each $v \in V_i$, attach a new pendant edge to
a fresh vertex, and \textbf{label these pendant
edges with depth $0$}.
\item For $d = 0, 1, 2, \ldots$: label every unlabelled
edge that shares a vertex with a depth-$d$ edge with
depth $d + 1$.
\item Stop when every edge has a depth label.
\end{enumerate}
\end{enumerate}
\noindent\textbf{Interpretation.} The depth labels give a BFS
distance in the line graph of $G'_i$ starting from the pendants
added at the cut. Equivalently, the depth of an edge $e$ in $G'_i$
is the minimum number of edges traversed (via shared-vertex
adjacency) to reach a pendant.
\noindent\textbf{Caveat.} If the cut $C$ is not a \emph{matching}
cut (i.e., the $6$ cut edges share vertices), then some boundary
vertices have degree $< 2$ in $G'_i$ and do not receive a pendant
under the strict reading of step~3(a). When the cut is a
matching, each of the $12$ boundary vertices ($6$ per side) has
degree exactly $2$ and receives a pendant; the construction is
symmetric.
\section*{Example: Holton-McKay graph \#0}
We apply the procedure to the first of the six non-Hamiltonian
$38$-vertex cubic plane graphs found by Holton and McKay (loaded
from \texttt{papers/even\_level\_graph\_generators/experiments/nonham38m4.pc}).
This $G'$ is itself a cubic plane graph; its dual $G$ is a
$21$-vertex triangulation.
\paragraph{The chosen 6-edge cut.}
Greedy search over $128$ distinct $6$-edge cuts in $G'$, preferring
\emph{matching cuts} (both sides have $6$ distinct boundary
vertices) and then balanced $|S|$, returns
\[
|S| = 10, \qquad
C = \{(34, 29),\, (35, 30),\, (26, 22),\, (27, 23),\,
(28, 24),\, (31, 25)\}.
\]
This is a matching cut: the $6$ edges have $12$ distinct endpoints,
$6$ on each side.
\paragraph{Resulting half-graphs.}
\begin{center}
\begin{tabular}{lcc}
\toprule
& $G'_0$ & $G'_1$ \\
\midrule
$|S|$ & $10$ & $28$ \\
Original vertices in $G'_i$ & $10$ & $28$ \\
$|V_i|$ (pendants added) & $6$ & $6$ \\
Total vertices in $G'_i$ & $16$ & $34$ \\
Total edges & $18$ & $45$ \\
Max depth assigned & $2$ & $7$ \\
\bottomrule
\end{tabular}
\end{center}
\noindent
Multi-cut vertices (degree $< 2$ in induced subgraph): \emph{none}
on either side, since the cut is a matching.
\paragraph{Visualization.}
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{fig_cut_depth_label.png}
\caption{Cut-and-depth-label procedure on Holton-McKay graph \#0
($38$ vertices, $57$ edges, cubic planar non-Hamiltonian). The
$6$-edge matching cut splits $G'$ into a $10$-vertex piece $G'_0$
(left) and a $28$-vertex piece $G'_1$ (right). Pendant edges
(dashed, dark purple) are at depth $0$; the colour gradient
encodes depth $0$ through max depth via BFS in the line-graph
sense. Orange squares are the new pendant vertices; red circles
are the boundary vertices in $V_i$; gray circles are interior
vertices.}
\label{fig:cut-depth-label}
\end{figure}
\section*{Connection to chain pigeonhole / 4CT reducibility}
The procedure mirrors the $4$CT cut-and-reglue scheme
(\texttt{rainbow\_proof.tex}, \texttt{worst\_case\_proof\_sketch.tex},
\texttt{two\_approaches\_comparison.tex}) at the structural level.
After cutting, each $G'_i$ is a cubic-minus-boundary graph; the
pendant additions formally restore cubicity at the $6$ degree-$2$
boundary vertices. The depth label on each edge measures its
``distance to the cut.''
For a minimum counterexample to the 4CT (i.e., a cubic plane $G'$
with no proper $3$-edge-colouring), the depth labels organise each
$G'_i$ into concentric layers indexed by distance to the cut. The
$3$-edge-colourings of $G'_i$ must extend a colouring at the
depth-$0$ pendants (= a ring colouring at the cut); the BFS
ordering by depth is the natural induction order for propagating
the colouring inward.
In the tire framework, the cut cycle $\gamma$ in the primal $G$
(corresponding to the $6$-edge cut in $G'$ via planar duality) plays
the role of the tire's inner boundary on one side and outer boundary
on the other. The depth label on $G'_i$-edges is exactly the dual
analogue of plane depth from $\gamma$ (cf.\ the level-cycle
generalization discussion in the recent conversation).
\section*{Limitations of this example}
\begin{itemize}
\item Holton-McKay graphs are cyclically $5$-edge-connected (not
$6$-edge-connected), so $6$-edge cuts are not the minimum
cyclic cut. The smallest cyclic edge cuts in this graph are
size $5$.
\item The matching $6$-cut found is highly imbalanced ($|S|=10$
vs.\ $|S^c|=28$). Searching among the $128$ distinct
$6$-edge cuts for a balanced matching cut may give better
examples.
\item Depth labels propagate via the line graph, not via vertex
BFS. An alternative procedure would label \emph{vertices}
by BFS distance from the boundary; both yield similar
layered structures but with slightly different counts.
\end{itemize}
\end{document}
Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB