uva 804 Petri Net Simulation 模拟

理解题意后,没有太大难度,直接模拟就好了,没有坑。

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

typedef struct node{
	map<int, int> input;
	map<int, int> output;
}node;

node NT[105];

int NP[105];

int n;  // 要求模拟的次数 
int p;  // NT的数量 
int flag; // 是否能模拟完n次 
int timee;

void simulation()
{
	flag = 1;
	int ok;
	for(int i = 1; i <= n; i++)
	{
		ok = 0;
		for(int j = 1; j <= p; j++)
		{
			int okk = 1;
			int okkk = 0;
			for(map<int, int>::iterator it = NT[j].input.begin(); it != NT[j].input.end(); ++it)
			{
			 	if(NP[it->first]-it->second < 0)
			 	{
			 		okk = 0;
			 		break;
			 	}
			 	else
			 	{
			 		NP[it->first] -= it->second;
			 		okkk = 1;
			 	}
			}
			if(okk && okkk)
			{
				ok = 1;
			 	for(map<int, int>::iterator it = NT[j].output.begin(); it != NT[j].output.end(); ++it)
			 		NP[it->first] += it->second;
			 	break;
			}
		}	 
		if(!ok)
		{
			flag = 0;
			timee = i;
			return;
		}
	}
}

int main()
{
	//freopen("zztest.txt","r",stdin);
	//freopen("zans.txt","w",stdout);
	int t;
	int u = 1;
	while(scanf("%d", &t) && t)
	{
		for(int i = 1; i <= 100; i++)
		{
			NT[i].input.clear();
			NT[i].output.clear();
		}
		for(int i = 1; i <= t; i++)
			scanf("%d ",&NP[i]);
		scanf("%d", &p);
		for(int i = 1; i <= p; i++)
		{
			int temp;
			while(scanf("%d", &temp) && temp)
			{
				if(temp < 0)
					NT[i].input[-temp]++;
				else
					NT[i].output[temp]++;
			}
		}
		scanf("%d", &n);
		simulation();
		//pirnt();
		if(flag == 0)
			printf("Case %d: dead after %d transitions\n", u++, timee-1);
		else
			printf("Case %d: still live after %d transitions\n", u++, n);
			
		printf("Places with tokens:");
		for(int i = 1; i <= t; i++)
			if(NP[i])
				printf(" %d (%d)", i, NP[i]);
		printf("\n\n");
	}
	return 0;
}
		

猜你喜欢

转载自blog.csdn.net/wukongakk/article/details/81081628