| 123456789101112131415161718192021222324252627282930313233343536373839 |
- #!/usr/bin/env python3
- import sys
- def parse(inp):
- rates = {}
- edges = {}
- for line in inp:
- _, node, _, _, flow, _, _, _, _, nbs = line.split(' ', 9)
- rates[node] = int(flow[5:-1])
- edges[node] = nbs.rstrip().split(', ')
- return rates, edges
- def shortest_paths(edges):
- inf = 10000
- dist = {node: {nb: 1 for nb in nbs} for node, nbs in edges.items()}
- dist['start'] = {'AA': 0}
- for node in dist:
- dist[node][node] = 0
- for a, adist in dist.items():
- for b, bdist in dist.items():
- for c in dist:
- alt = bdist.get(a, inf) + adist.get(c, inf)
- if bdist.get(c, inf) > alt:
- bdist[c] = alt
- return dist
- def open_valves(rates, dist, time):
- def travel(released, time, pos, closed):
- yield released
- for dst in closed:
- t = time - dist[pos][dst] - 1
- if t >= 0:
- yield from travel(released + rates[dst] * t, t, dst, closed - {dst})
- valves = {node for node, rate in rates.items() if rate}
- return max(travel(0, time, 'start', valves))
- rates, edges = parse(sys.stdin)
- print(open_valves(rates, shortest_paths(edges), 30))
|