def ef(S): e=0 for b in range(11): u=edges[b][0] if bit(S,u-1): e=e|(1<12: return frozenset([S]) E=ef(S) if not invited(i,S,E): return O(i-(-1),S) res=set() if i==8: outs8=O(9,S|B[8]) vals8=[payoffs(T,ef(T))[8] for T in outs8] if min(vals8)<=7.0000001: res.update(O(9,S)) if max(vals8)>=6.9999999: for T in outs8: if payoffs(T,ef(T))[8]>=6.9999999: res.add(T) else: if ZStay(i,S,i): res.update(O(i-(-1),S)) res.update(O(i-(-1),S|B[i])) return frozenset(res) def ZStay(i,S,t): return Z(i-(-1),S|B[i],t) @lru_cache(None) def Z(i,S,t): if i>12: return payoffs(S,ef(S))[t]==0 E=ef(S) if not invited(i,S,E): return Z(i-(-1),S,t) if i==8: outs8=O(9,S|B[8]) vals8=[payoffs(T,ef(T))[8] for T in outs8] if min(vals8)<=7.0000001 and Z(9,S,t): return True for T in outs8: pys=payoffs(T,ef(T)) if pys[8]>=6.9999999 and pys[t]==0: return True return False if ZStay(i,S,i) and Z(i-(-1),S,t): return True return Z(i-(-1),S|B[i],t) return O(1,0)