码迷,mamicode.com
首页 > Web开发 > 详细

804 - Petri Net Simulation

时间:2015-03-06 15:53:48      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:acm   uva   

一开始没好好读题。。漏了一个很重要的地方:当每个变迁的每个输入库所都至少有一个token时,变迁是允许的。变迁发生的结果是每个输入库所减少一个token,每个输出库所增加一个token。  注意是每一个啊~~

我写了个结构体,结构体里有两个映射成员,分别表示这个变迁的输入库和输出库。键表示序号,值表示需要的token个数。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+9;
int n,m,a[maxn],cnt,ans,bbs=0;
struct net{
    map<int,int> inp;
    map<int,int>outp;
};
int main() {
    while(scanf("%d",&n)!=EOF&&n) {
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&m);
        net s[maxn];
        for(int i=1;i<=m;i++){
            while(scanf("%d",&ans)!=EOF) {
                if(ans==0) break;
                else if(ans<0) {
                    if(!s[i].inp.count(-ans)) s[i].inp[-ans]=1;
                    else s[i].inp[-ans]++;
                }
                else {
                    if(!s[i].outp.count(ans)) s[i].outp[ans]=1;
                    else s[i].outp[ans]++;
                }
            }
        }
        scanf("%d",&cnt);
        int kase=0;
        map<int,int> ::iterator it;
        while(1) {
            bool flage=false;
            for(int i=1;i<=n;i++){
                if(a[i]!=0){
                for(int j=1;j<=m;j++){
                    if(s[j].inp.count(i)&&s[j].inp[i]<=a[i]) {
                        flage=true;
                        for(it=s[j].inp.begin();it!=s[j].inp.end();++it)
                            if(a[(*it).first]<(*it).second) flage=false;
                        if(flage)
                        for(it=s[j].inp.begin();it!=s[j].inp.end();++it)
                            a[(*it).first]-=(*it).second;
                        for(it=s[j].outp.begin();it!=s[j].outp.end();++it)
                                a[(*it).first]+=(*it).second;
                        break;
                    }
                }
                }
                if(flage) break;
            }
            if(flage) {
                kase++;
                if(kase>=cnt) break;
            }
            else break;
        }
        if(kase==cnt) printf("Case %d: still live after %d transitions\n",++bbs,cnt);
        else printf("Case %d: dead after %d transitions\n",++bbs,kase);
            printf("Places with tokens:");
        for(int i=1;i<=n;i++)
            if(a[i]!=0) printf(" %d (%d)",i,a[i]);
            printf("\n\n");
    }
    return 0;
}


804 - Petri Net Simulation

标签:acm   uva   

原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/44100277

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!