12_paths.py 830 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. graph = {}
  5. for line in f:
  6. a, b = line.rstrip().split('-')
  7. if b != 'start' and a != 'end':
  8. graph.setdefault(a, []).append(b)
  9. if a != 'start' and b != 'end':
  10. graph.setdefault(b, []).append(a)
  11. return graph
  12. def paths(graph, may_dup):
  13. work = [('start', {'start'}, not may_dup)]
  14. distinct = 0
  15. while work:
  16. prev, visited, dup = work.pop()
  17. for nb in graph[prev]:
  18. if nb == 'end':
  19. distinct += 1
  20. elif nb.isupper() or nb not in visited:
  21. work.append((nb, visited | {nb}, dup))
  22. elif not dup:
  23. work.append((nb, visited, True))
  24. return distinct
  25. graph = parse(sys.stdin)
  26. print(paths(graph, False))
  27. print(paths(graph, True))