fork download
  1. R=range
  2. def T(g,s):
  3. q=[[s]]
  4. while q:A=q.pop(0);yield(l:={b for i in A for a,b in g if a==i});q+=l,
  5. def f(g,e,s):
  6. q,a,D,v=[(e,0,s,0)],[(e,s)],{},[]
  7. while q:
  8. E,c,S,B=q.pop(0);v+=B,;J=1
  9. if c<len(E):
  10. if-1==E[c]:q+=(E,c+1,s,B),;continue
  11. for i in next(T(g,E[c])):
  12. O=[*E];J=0
  13. if i-S:O[c]=i;q+=[(O,c+1,S,B)]*-~-((O,S)in a)
  14. else:O[c]=-1;q+=(O,c+1,S,B+1),
  15. q+=[(O,c+1,S,B)]*J
  16. else:
  17. t,L=T(g,S),0
  18. for i in R(max(sum(k==-1for k in E)+1,1)):
  19. for I in R(L,L:=i+1):M=next(t)
  20. for I in M:
  21. O=[*E];x=B
  22. for y in R(len(E)):G=O[y]==I;O[y]=[O[y],-1][G];x+=G;v+=x,
  23. if(O,I)not in a:q+=(O,0,I,x),;a+=(O,I),
  24. return max(v)
  25.  
  26. print(f([(0, 1), (1, 2)], [0, 2], 1))
  27. print(f([(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2))
  28. print(f([(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0))
  29. print(f([(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 3)], [2, 6], 0))
Success #stdin #stdout 0.12s 14152KB
stdin
Standard input is empty
stdout
2
2
0
2