没啥好说的。。。直接模拟。
#include <cstdio>
#include <cstring>
#define ll long long
#define inf 2000000000
int const N=105;
int np,nt,cnt,p[N],tst=0,ans=0;
struct trans{
int in[N],out[N],fin[N],fout[N],nin,nout;
void init(){
memset(fin,0,sizeof(fin));
memset(fout,0,sizeof(fout));
nin=0;nout=0;
}
}t[N];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline int min(int x,int y){return x<y?x:y;}
inline void print(bool flag){
printf("Case %d: ",tst);
if(flag) printf("still live after %d transitions\n",ans);
else printf("dead after %d transitions\n",ans);
printf("Places with tokens:");
for(int i=1;i<=np;++i) if(p[i]!=0)
printf(" %d (%d)",i,p[i]);
puts("");
puts("");
}
int main(){
// freopen("B.in","r",stdin);
// freopen("B.out","w",stdout);
while(1){
np=read();
if(np==0) break;tst++;
for(int i=1;i<=np;++i) p[i]=read();
nt=read();
for(int i=1;i<=nt;++i){
t[i].init();
while(1){
int x=read();
if(x==0) break;
if(x<0){
if(t[i].fin[-x]==0) t[i].in[++t[i].nin]=-x;
t[i].fin[-x]++;
}
else{
if(t[i].fout[x]==0) t[i].out[++t[i].nout]=x;
t[i].fout[x]++;
}
}
}
cnt=read();ans=0;
for(int i=1;i<=nt;++i){
if(ans==cnt) break;
bool flag=true;
for(int j=1;j<=t[i].nin;++j){
int x=t[i].in[j];
if(p[x]<t[i].fin[x]) {flag=false;break;}//ith trans is disabled
}
if(!flag) continue;//look for an enabled trans
for(int j=1;j<=t[i].nin;++j){
int x=t[i].in[j];
p[x]-=t[i].fin[x];
}
for(int j=1;j<=t[i].nout;++j){
int x=t[i].out[j];
p[x]+=t[i].fout[x];
}
ans++;i=0;//begin from 1 to find the enabled one ,evry time
}
if(ans==cnt) print(1);
else print(0);
}
return 0;
}