将每个translation的输入和输出place全部记录下来,模拟即可,当所有translation都不能工作时,就说明dead了。
AC代码:
#include<cstdio>#include<vector>using namespace std;const int maxn = 100 + 5;struct node{ vector<int> in, out;}tran[maxn];int p[maxn]; //the number of tokens in all placesint main(){ int pn, tn, nf, kase = 1; while(scanf("%d", &pn) == 1 && pn){ for(int i = 1; i <= pn; ++i){ scanf("%d", &p[i]); } scanf("%d", &tn); for(int i = 1; i <= tn; ++i){ int x; while(scanf("%d", &x) == 1 && x){ if(x < 0) tran[i].in.push_back(-x); else tran[i].out.push_back(x); } } scanf("%d",&nf); bool dead = 0; int h; for(h = 0; h < nf; ++h){ int cnt = 0; for(int i = 1; i <= tn; ++i){ bool flag = 1; vector<int> &in = tran[i].in, &out = tran[i].out; for(int j = 0; j < in.size(); ++j){ if(p[in[j]] == 0) { flag = 0; while(j) p[in[--j]]++; // break; } else p[in[j]]--; } if(!flag) ++cnt; else { for(int k = 0; k < out.size(); ++k) p[out[k]]++; break; } } if(cnt == tn) { dead = 1; break; } } if(dead) PRintf("Case %d: dead after %d transitions/n", kase++, h); else printf("Case %d: still live after %d transitions/n", kase++, nf); printf("Places with tokens:"); for(int i = 1; i <= pn ; ++i){ if(p[i]) printf(" %d (%d)", i, p[i]); } printf("/n/n"); for(int i = 1; i <= tn ; ++i) { tran[i].in.clear(); tran[i].out.clear(); } } return 0;}如有不当之处欢迎指出!
新闻热点
疑难解答