# %% Petri Net Simulation
from collections import Counter
import sys
def simulate_petri(tokens, transitions, nsteps):
def print_tokens():
print('Places with tokens:', end='')
for i, t in enumerate(tokens):
if t > 0:
print(" {} ({})".format(i, t), end='')
print()
print()
for step in range(nsteps):
for transition in transitions:
input_requirements = transition[0]
for input_placement in input_requirements:
if tokens[input_placement] < input_requirements[input_placement]:
break
else:
for key in transition[0]:
tokens[key] -= transition[0][key]
for key in transition[1]:
tokens[key] += transition[1][key]
break
else:
# no transactions have been made
print("dead after {} transitions".format(step))
print_tokens()
return
print("still live after {} transitions".format(nsteps))
print_tokens()
def generator():
for line in sys.stdin:
for num in line.split():
yield int(num)
# %%
def main():
gen = generator()
ncases = 0
while True:
np = next(gen)
if np == 0:
return
ncases += 1
print("Case {}: ".format(ncases), end="")
tokens = [0] + [next(gen) for _ in range(np)] # 1-based indexing
nt = next(gen)
transitions = []
for _ in range(nt):
inputs = Counter()
outputs = Counter()
for num in gen:
if num < 0:
inputs[-num] += 1
elif num > 0:
outputs[num] += 1
else:
transitions.append((inputs, outputs))
break
nsteps = next(gen)
simulate_petri(tokens, transitions, nsteps)
if __name__ == '__main__':
main()
写了个C++版本倒是一遍就AC了。。。不知道哪里出了问题