习题6-7 Petri网模拟 (Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)

Posted As_zyh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题6-7 Petri网模拟 (Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)相关的知识,希望对你有一定的参考价值。

理解题意后不难

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

int NP, NT, n;
int tokens[110];
char s[1000];
vector<int> from[110];
vector<int> to[110];

int main() {
	#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif
	int q = 0;
	while(scanf("%d", &NP) == 1 && NP) {
		q++;
		memset(tokens, 0, sizeof(tokens));
		for(int i = 0; i < 110; i++) {
			from[i].clear();
			to[i].clear();
		}
		for(int i = 0; i < NP; i++) scanf("%d", &tokens[i+1]);
		scanf("%d", &NT);
		for(int i = 0; i < NT; i++) {
			int x;
			while(scanf("%d", &x) == 1 && x) {
				if(x < 0) from[i].push_back(x*(-1));
				else to[i].push_back(x);
			}
		}
		scanf("%d", &n);
		int cnt = 0;
		while(cnt < n) {
			int flag;
			for(int i = 0; i < NT; i++) {
				//变迁 T i+1 
				int x;
				flag = 0; //变迁是否能完整执行 
				for(int j = 0; j < from[i].size(); j++) {
					x = from[i][j];
					if(tokens[x] > 0) tokens[x]--;
					else {
						//回滚
						for(int k = j-1; k >= 0; k--) {
							x = from[i][k];
							tokens[x]++;
						}
						flag = 0;
						break;
					}
					flag = 1;
				}
				
				if(!flag) continue; //此变迁不能执行,尝试下一个变迁 
				
				for(int j = 0; j < to[i].size(); j++) {
					x = to[i][j];
					tokens[x]++;
				}
				if(flag) {
					cnt++;break;
				}
			}
			if(!flag) break; //没有一个变迁可以执行 
		}
		if(cnt == n) printf("Case %d: still live after %d transitions\\n", q, cnt);
		else printf("Case %d: dead after %d transitions\\n", q, cnt);
		printf("Places with tokens:");
		for(int i = 1; i < 110; i++) {
			if(tokens[i] > 0) printf(" %d (%d)", i, tokens[i]);
		}
		printf("\\n\\n");
	}
	return 0;
}

以上是关于习题6-7 Petri网模拟 (Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)的主要内容,如果未能解决你的问题,请参考以下文章

Petri网

TIme Petri Net Analyzer仿真软件下载及使用教程

为啥 Petri 网的可达性图中未定义最终标记的数量?

Spark 入门之 Scala 语言解释及示例讲解

软件测试基础知识——测试用例设计方法

[PTA]习题6-7 简单计算器