UVa804 习题 6-7 Petri网模拟(Petri Net Simulation,ACM/ICPC World Finals 1998)
来源:互联网 发布:网络电视怎么重新搜台 编辑:程序博客网 时间:2024/04/30 02:43
原题链接: UVa-804
题目大意:
模拟Petri网,(图参考原题或紫书)包含NP个库(圆圈),NT个变迁(大棒♂),大棒与若干个input(圆圈)和若干个output(圆圈)相连,只有每个input(也可当做指向大棒的箭头)都有一个小黑球时,input减少一个小黑球,才能完成变迁,然后output里会增加小黑球。题目要求能不能完成给定的跃迁数。
解题思路:
其实这道题啊我已开始没有看明白的,紫书和原题上都没看懂,后来参考了别的小伙伴的博客才明白。大致主要代码的大致思路就是:依次对每个T(i)进行执行,如果每个input都能执行成功(NP中有token)则执行,则执行output,并将执行T(i)的次数++,否则恢复刚才所有执行的input。一轮(将所有T(i)执行一遍)中任意一个T(i)执行就可以执行下一轮。如果一轮中没有任何一个T(i)执行成功则说明执行失败,返回执行次数。
代码:
#include<iostream>#include<cstring>#include<string>using namespace std;int deal();const int MAXN = 100 + 10;int NP[MAXN];//P(i)现存小球的数量int NT_in[MAXN][MAXN];//存储T(i)的inputint NT_out[MAXN][MAXN];//存储T(i)的outputint n, m, num;int main(){int kase = 0;while (cin >> n && n){//初始化memset(NT_in,0,sizeof(NT_in));memset(NT_out, 0, sizeof(NT_out));int k,i, j, x, do_num;for (i = 1; i <= n; i++) cin >> NP[i];cin >> m;for (i = 0; i < m; i++){k = j = 0;while (cin >> x && x){if (x < 0) NT_in[i][j++] = x;else NT_out[i][k++] = x;}}cin >> num;//处理do_num = deal(); //处理函数,返回执行变迁的次数//输出if(do_num == num) cout << "Case " << ++kase << ": still live after " << do_num << " transitions\n";else cout << "Case " << ++kase << ": dead after " << do_num << " transitions\n";cout << "Places with tokens:";for (int i = 1; i <= n; i++)//逐个输出有token的P,和个数if (NP[i] > 0)cout << " " << i << " (" << NP[i] << ")";cout << endl << endl;}return 0;}/*依次对每个T(i)进行执行,如果每个input都能执行成功(NP中有token)则执行,则执行output,并将执行T(i)的次数++,否则恢复刚才所有执行的input。一轮(将所有T(i)执行一遍)中任意一个T(i)执行就可以执行下一轮。如果一轮中没有任何一个T(i)执行成功则说明执行失败,返回执行次数。*/int deal(){int i, j, n = 1;while(1){bool had_do = false; //该轮中有T(i)执行,可以执行下一轮for (i = 0; i < m; i++){j = 0; bool can_do = true;//该T(i)执行是否成功while (NT_in[i][j] != 0){if (NP[-NT_in[i][j]] > 0)//执行inputNP[-NT_in[i][j++]]--;else{ //input执行失败,恢复input之前状态,并将can_do置为falsewhile (j--)NP[-NT_in[i][j]]++;can_do = false; break;}}if (can_do){//input执行成功的情况下执行outputj = 0; n++;//***while (NT_out[i][j] != 0){NP[NT_out[i][j]]++;j++;}had_do = true;if (n > num) return num;}else break;}if (!had_do) return n-1;}}
阅读全文
0 0
- UVa804 习题 6-7 Petri网模拟(Petri Net Simulation,ACM/ICPC World Finals 1998)
- 习题6-7 Petri网模拟(Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)
- uva804 Petri Net Simulation [PKU2017SC](模拟)
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
- UVa 804 - Petri Net Simulation(模拟)
- 804 - Petri Net Simulation(简单魔模拟)
- 804 - Petri Net Simulation
- 804 - Petri Net Simulation
- Petri Net Simulation UVA
- UVa 804 Petri Net Simulation
- Uva - 804 - Petri Net Simulation
- UVA 804 Petri Net Simulation
- UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)
- 习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
- [中等] UVa OJ 804 Petri Net Simulation
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- 习题6-12 筛子难题(A Dicey Problem, ACM/ICPC World Finals 1999, UVa810)
- 习题6-13 电子表格计算器(Spreadsheet Calculator, ACM/ICPC World Finals 1992, UVa215)
- HTML特殊字符编码对照表
- SILVAngs:免费在线宏基因组扩增子分析系统
- node-sass 安装失败的解决措施
- 创建Scrapy项目报错 UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 19
- Android----实现短信发送器功能
- UVa804 习题 6-7 Petri网模拟(Petri Net Simulation,ACM/ICPC World Finals 1998)
- 有关谷歌浏览器的一个问题
- php webservice中使用soapheader简单验证 实例
- 【CSS 基础】 12 position
- 如何将控件放到指定位置上
- Java保留小数点若干位的输出方法
- httpclient4.3 封装工具类
- eclipse项目上有红叉叉,但是项目没错,problem报:Tomcat v7.0 Unknown Faceted Project Problem
- 你有没有过那种明知是对的但却没能去做的事?