Problem UVA804-Petri Net Simulation

Accept:251  Submit:1975

Time Limit: 3000 mSec

Problem Description

 Input

Each Petri net description will first contain an integer NP (0 < NP < 100) followed by NP integers specifying the number of tokens initially in each of the places numbered 1,2,...,NP. Next there will appear an integer NT (0 < NT < 100) specifying the number of transitions. Then, for each transition (in increasing numerical order 1,2,...,NT) there will appear a list of integers terminated by zero. The negative numbers in the list will represent the input places, so the number −n indicates there is an input place at n. The positive numbers in the list will indicate the output places, so the number p indicates an output place at p. There will be at least one input place and at least one output place for each transition. Finally, after the description of all NT transitions, there will appear an integer indicating the maximum number of firings you are to simulate, NF. The input will contain one or more Petri net descriptions followed by a zero.

 Output

For each Petri net description in the input display three lines of output. On the first line indicate the number of the input case (numbered sequentially starting with 1) and whether or not NF transitions were able to fire. If so, indicate the net is still live after NF firings. Otherwise indicate the net is dead, and the number of firings which were completed. In either case, on the second line give the identities of the places which contain one or more tokens after the simulation, and the number of tokens each such place contains. This list should be in ascending order. The third line of output for each set should be blank. The input data will be selected to guarantee the uniqueness of the correct output displays.

 Sample Input

2
1 0
2
-1 2 0
-2 1 0
100
3
3 0 0
3
-1 2 0
-2 -2 3 0
-3 1 0
100
0
 

 Sample Ouput

Case 1: still live after 100 transitions

Places with tokens: 1 (1)
Case 2: dead after 9 transitions

Places with tokens: 2 (1)

题解:这个题就是个模拟,题意稍有一些难懂(英文比紫书的中文好懂......)

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std; const int maxn = +; struct Place{
int token;
}place[maxn]; struct Point{
int pos,sum;
Point(int pos = ,int sum = ) :
pos(pos),sum(sum) {}
}; struct Tra{
vector<Point> input,output;
}Tra[maxn]; int n,m,iCase = ;
int in[maxn],out[maxn]; bool solve(){
for(int i = ;i <= m;i++){
bool ok = true;
for(int j = ;j < (int)Tra[i].input.size();j++){
int pos = Tra[i].input[j].pos;
int sum = Tra[i].input[j].sum;
if(place[pos].token < sum){
ok = false;
break;
}
}
if(ok){
for(int k = ;k < (int)Tra[i].input.size();k++){
int pos = Tra[i].input[k].pos;
int sum = Tra[i].input[k].sum;
place[pos].token -= sum;
}
for(int k = ;k < (int)Tra[i].output.size();k++){
int pos = Tra[i].output[k].pos;
int sum = Tra[i].output[k].sum;
place[pos].token += sum;
}
return true;
}
}
return false;
} int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%d",&n) && n){
for(int i = ;i <= n;i++){
scanf("%d",&place[i].token);
}
scanf("%d",&m);
for(int i = ;i <= m;i++){
Tra[i].input.clear();
Tra[i].output.clear();
}
int x;
for(int i = ;i <= m;i++){
memset(in,,sizeof(in));
memset(out,,sizeof(out));
while(scanf("%d",&x) && x){
if(x < ) in[-x]++;
else out[x]++;
}
for(int t = ;t <= n;t++){
if(in[t]) Tra[i].input.push_back(Point(t,in[t]));
if(out[t]) Tra[i].output.push_back(Point(t,out[t]));
}
}
int round;
scanf("%d",&round);
int tt;
for(tt = ;tt <= round;tt++){
if(!solve()) break;
}
printf("Case %d: ",iCase++);
if(tt > round) printf("still live after %d transitions\n",round);
else printf("dead after %d transitions\n",tt-);
printf("Places with tokens:");
for(int i = ;i <= n;i++){
if(place[i].token){
printf(" %d (%d)",i,place[i].token);
}
}
printf("\n\n");
}
return ;
}

UVA804-Petri Net Simulation(模拟)的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  2. Uva - 804 - Petri Net Simulation

    Input: petri.in A Petri net is a computational model used to illustrate concurrent activity. Each Pe ...

  3. 【习题 6-7 UVA - 804】Petri Net Simulation

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟就好 [代码] /* 1.Shoud it use long long ? 2.Have you ever test sever ...

  4. Leetcode874.Walking Robot Simulation模拟行走的机器人

    机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度 -1:向右转 90 度 1 <= x <= 9:向 ...

  5. LightOJ Beginners Problems 部分题解

    相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...

  6. 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事

    前言: 本文是根据的文章Introduction to Monte Carlo Tree Search by Jeff Bradberry所写. Jeff Bradberry还提供了一整套的例子,用p ...

  7. NeHe OpenGL教程 第三十九课:物理模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. swat主流域文件(file.cio)参数详解——引自http://blog.sciencenet.cn/blog-922140-710636.html

    % file.clo,即主流域文件用于文件管理,包括与模型选项.气候输入.数据库和输出控制相关的信息. Master Watershed File: file.cio Project Descript ...

  9. QM5_Didstribution

    Basic Concepts Probability distribution Discrete distribution (离散分布) The distribution of the discret ...

  10. Cisco Packet Tracer中通过集线器组网

    Cisco Packet Tracer中可以通过集线器将多台电脑完成通信. Cisco Packet Tracer 6.2.0 一.添加三台电脑设备 1.按照下图1.2步骤操作,2步骤执行三次,拖拽P ...

随机推荐

  1. C#微信公众号开发--微信事件交互

    前言 一切准备工作就绪时就先实现一个关注公众号后向客户端推送一条消息.关注后推送消息需要一个get请求.一个post请求,get请求主要是为了向微信服务器验证,post请求主要就是处理微信消息了. 调 ...

  2. Asp.Net初学小结

    第一章   1.搭建Asp.net开发环境   1).net FrameWork(VS) 2)IIS(xp:5.1,2003:6.0,vista:70,win7:7.5) C:\Windows\Mic ...

  3. jquery中innerwidth,outerwidth,outerwidth和width的区别

    在jQuery中,width()方法用于获得元素宽度: innerWidth()方法用于获得包括内边界(padding)的元素宽度, outerWidth()方法用于获得包括内边界(padding)和 ...

  4. Centos7下开启80端口

    firewall-cmd --zone=/tcp --permanent 命令含义:   --zone #作用域   --add-port=80/tcp  #添加端口,格式为:端口/通讯协议   -- ...

  5. 详解promise、async和await的执行顺序

    1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...

  6. 数组式访问-ArrayAccess

    以前对ArrayAccess不是很熟悉,现在整理下下有关ArrayAccess相关的知识,ArrayAccess接口就是提供像访问数组一样访问对象的能力的接口. 接口内容如下: ArrayAccess ...

  7. Python 获取时间

    记录下 Python 下获取时间的方法 time 模块 import time time_format = '%Y-%m-%d %X' time_current = time.strftime(tim ...

  8. python之黏包和黏包解决方案

    黏包现象主要发生在TCP连接, 基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看来,根本不知道该文件的字节流从何处开始,在何处结束. 两种黏包现象: 1 ...

  9. filter(ele)过滤数组

    filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素. 例如,在一个Array中,删掉偶数,只保留奇数,可以这么写: function remove(arr) { l ...

  10. Salesforce 小知识 - 必需字段

    将字段定义为"必需" 当我们为对象设置字段的属性时,我们需要让某些字段在建立记录的时候必需有值,比如定义一个"地址"对象,那么必须填入"邮编" ...