-
Notifications
You must be signed in to change notification settings - Fork 142
/
Copy pathp2.py
50 lines (41 loc) · 1.23 KB
/
p2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import heapq
from collections import defaultdict
import re
nodes = set()
edges = defaultdict(set)
with open('input') as f:
for line in f:
regex = r'Step (.) must be finished before step (.) can begin\.'
match = re.match(regex, line)
src, dest = match.group(1), match.group(2)
nodes.add(src)
nodes.add(dest)
edges[src].add(dest)
def score(x): return ord(x) - 4
timeremaining = {k: score(k) for k in nodes}
# build incoming connections map
incomings = {k: 0 for k in nodes}
for src, neighbours in edges.items():
for dest in neighbours:
incomings[dest] += 1
time = 0
queue = [k for k in nodes if incomings[k] == 0]
heapq.heapify(queue)
processing = set()
while queue or processing:
time += 1
idle = 5 - len(processing)
if idle > 0:
for worker in range(min(idle, len(queue))):
processing.add(heapq.heappop(queue))
done = set()
for task in processing:
timeremaining[task] -= 1
if timeremaining[task] == 0:
done.add(task)
for dest in edges[task]:
incomings[dest] -= 1
if incomings[dest] == 0:
heapq.heappush(queue, dest)
processing -= done
print(time)