UVA804 Petri网模拟 Python蜜汁TLE
  • 板块题目总版
  • 楼主arsdragonfly
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/11/14 19:02
  • 上次更新2023/11/4 00:33:51
查看原帖
UVA804 Petri网模拟 Python蜜汁TLE
347804
arsdragonfly楼主2021/11/14 19:02
# %% 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了。。。不知道哪里出了问题

2021/11/14 19:02
加载中...