每天坚持做算法题,熟悉基本的套路,巩固语言基础,总结经验记下所学所想。
题目描述
你的任务是模拟Petri网的变迁。Petri网包含NP个库所(用P1,P2…表示)和NT个变迁 (用T1,T2…表示)。0<NP, NT<100。当每个变迁的每个输入库所都至少有一个token时, 变迁是允许的。变迁发生的结果是每个输入库所减少一个token,每个输出库所增加一个 token。变迁的发生是原子性的,即所有token的增加和减少应同时进行。注意,一个变迁可 能有多个相同的输入或者输出。如果一个库所在变迁的输入库所列表中出现了两次,则token 会减少两个。输出库所也是类似。如果有多个变迁是允许的,一次只能发生一个。
如图6-24所示,一开始只有T1是允许的,发生一次T1变迁之后有一个token会从P1移动
到P2,但仍然只有T1是允许的,因为T2要求P2有两个token。再发生一次T1变迁之后P1中只 剩一个token,而P2中有两个,因为T1和T2都可以发生。假定T2发生,则P2中不再有token,
而P3中有一个token,因此T1和T3都是允许的。
HINT
输入一个Petri网络。初始时每个库所都有一个token。每个变迁用一个整数序列表示,负 数表示输入库所,正数表示输出库所。每个变迁至少包含一个输入和一个输出。最后输入一 个整数NF,表示要发生NF次变迁(同时有多个变迁允许时可以任选一个发生,输入保证这
个选择不会影响最终结果)。
依次对每个T(i)进行执行,如果每个input都能执行成功(NP中有token)则执行,则执行output,并将执行T(i)的次数++,否则恢复刚才所有执行的input。一轮(将所有T(i)执行一遍)中任意一个T(i)执行就可以执行下一轮。如果一轮中没有任何一个T(i)执行成功则说明执行失败,返回执行次数。
代码
1 |
|
总结
重点在于理解题意