Ldu 1824. G . Petri Net Simulation

题目描述 :

你的任务是模拟Petri网的变迁。Petri 网包含NP个库所(用P1,P2…表示) 和NT个变迁(用T1, T2…表示)。0<NP, NT<100。当每个变迁的每个输入库所都至少有一个 token时,变迁是允许的。变迁发生的结果是每个输入库所减少一个 token, 每个输 出库所增加一个token。变迁的发生是原子性的,即所有token 的增加和减少应同时进行。注意,一个变迁可能有多个相同的输入或者输出。如果一个库所在变迁的输入库所列表中出现了两次,则token会减少两个。输出库所也是类似。如果有多个变迁是允许的,一次只能发生个。如下图所示,一开始只有T1 是允许的,发生次TI变迁之后有一个token会从P1移动到P2,但仍然只有T1是允许的,因为T2要求P2有两个token.再发生-次T1变迁之后PI中只剩一个token,而P2中有两个,因为T1和T2都可以发生。假定T2发生,则P2中不再有token,而P3中有一个token,因此T1和T3都是允许的。

输入一个Petri网络。初始时每个库所都有一个token。每个变迁用一个整数序列表示,负数表示输入库所,正数表示输出库所。每个变迁至少包含一个输 入和一个输出。最后输入一个整数NF,表示要发生NF次变迁(同时有多个变迁允许时可以任选一个发生,输入保证这个选择不会影响最终结果)。

思路:理解+模拟

代码如下:

#include<bits/stdc++.h>
using namespace std;

const int Maxn = 100 + 5;
struct Node{
	vector<int> in,out;
}tran[Maxn];
int p[Maxn];
int main() {
	int Pn,Tn,Nf,kase = 0;
	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 l;
		for(l=0; l<Nf; l++) {
			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,l);
		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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.ldu.controller; import com.ldu.pojo.Admin; import com.ldu.pojo.Goods; import com.ldu.pojo.Orders; import com.ldu.pojo.Purse; import com.ldu.pojo.User; import com.ldu.service.AdminService; import com.ldu.service.GoodsService; import com.ldu.service.OrdersService; import com.ldu.service.PurseService; import com.ldu.service.UserService; import com.ldu.util.GoodsGrid; import com.ldu.util.OrdersGrid; import com.ldu.util.PurseGrid; import com.ldu.util.UserGrid; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * 2018-3-7 10:40:38 */ @Controller @RequestMapping(value = "/admin") public class AdminController { @Resource private UserService userService; @Resource private GoodsService goodsService; @Resource private OrdersService ordersService; @Resource private PurseService purseService; @Resource private AdminService adminService; @RequestMapping(value = "", method = RequestMethod.GET) public String login(HttpSession session) { // 清除session //session.invalidate(); return "/admin/login"; } @RequestMapping(value = "/index", method = RequestMethod.POST) public String index(HttpServletRequest request, Admin admins) { Admin myadmin = adminService.findAdmin(admins.getPhone(), admins.getPassword()); if (myadmin != null) { request.getSession().setAttribute("admin", myadmin); return "/admin/index"; } return "/admin/login"; } @RequestMapping(value = "/indexs") public String indexs(HttpServletRequest request) { Admin admin = (Admin) request.getSession().getAttribute("admin"); if (admin != null) { Integer id = admin.getId(); Admin myadmin = adminService.findAdminById(id); request.getSession().setAttribute("admin", myadmin); return "/admin/index"; } return "/admin/login"; }
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值