16_tunnels.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(inp):
  4. rates = {}
  5. edges = {}
  6. for line in inp:
  7. _, node, _, _, flow, _, _, _, _, nbs = line.split(' ', 9)
  8. rates[node] = int(flow[5:-1])
  9. edges[node] = nbs.rstrip().split(', ')
  10. return rates, edges
  11. def shortest_paths(edges):
  12. inf = 10000
  13. dist = {node: {nb: 1 for nb in nbs} for node, nbs in edges.items()}
  14. dist['start'] = {'AA': 0}
  15. for node in dist:
  16. dist[node][node] = 0
  17. for a, adist in dist.items():
  18. for b, bdist in dist.items():
  19. for c in dist:
  20. alt = bdist.get(a, inf) + adist.get(c, inf)
  21. if bdist.get(c, inf) > alt:
  22. bdist[c] = alt
  23. return dist
  24. def open_valves(rates, dist, time):
  25. def travel(released, time, pos, closed):
  26. yield released
  27. for dst in closed:
  28. t = time - dist[pos][dst] - 1
  29. if t >= 0:
  30. yield from travel(released + rates[dst] * t, t, dst, closed - {dst})
  31. valves = {node for node, rate in rates.items() if rate}
  32. return max(travel(0, time, 'start', valves))
  33. rates, edges = parse(sys.stdin)
  34. print(open_valves(rates, shortest_paths(edges), 30))