zoukankan      html  css  js  c++  java
  • Beam me out!

    Beam me out!

    题目描述

    King Remark, first of his name, is a benign ruler and every wrongdoer gets a second chance after repenting his crimes in the Great Maze!
    Today’s delinquent is a renowned computer scientist, but his fame didn’t do him any good after he declined to do research on the so called and soon-to-be-famous Remark’s algorithms! Those strange randomized algorithms may run indefinitely long (or even never terminate) and may or may not produce a right answer if terminated.
    Handily, the Great Maze got recently a major upgrade with the newest beaming technology which made all doors obsolete: After the delinquent says the magic words “I was wrong and will never disappoint king Remark again!” he will be immediately beamed to the next room. It will be chosen
    randomly from a list of possible goal rooms. 
    The Great Maze consists of n rooms numbered 1 to n. Every detainee starts his quest for pardon in room 1 and hopes to get to the throne room n in which he will receive his pardon. If he ends up in a room, whose list of goal rooms is empty, his tour is over; through he could surely say the magic
    words again and again – that would not hurt, but would not help him either.
    Great king Remark, as most of the kings, doesn’t like surprises and summoned you to answer two questions: Is it guaranteed, that the criminal will get to the throne room and is there a limit of beaming operations after which the game is over for sure.
    You know better, than to disappoint the great king with a wrong answer or no answer at all, don’t you?

    输入

    The input contains a single test case. It starts with a line consisting of an integer 2 ≤ n ≤ 50 000 – the number of rooms in the Great Maze. For each of the rooms 1 to n − 1, two lines will follow representing the corresponding list of the goal rooms (in order 1 to n − 1). Bear in mind, that after
    reaching the throne room n the quest is over. Thus, the list of the throne room is not a part of the input.
    The first of these two lines will contain an integer 0 ≤ m ≤ n – the number of goal rooms on the list.
    The second line will contain a list of m goal rooms or an empty string, if m = 0. Each list will be sorted in strictly ascending order (this implies every number on the list will be unique) and consist from integers between 1 and n, inclusive.
    The total number of goal rooms summed over all lists will not exceed 106.

    输出

    For each test case a line consisting of two words:
    • the first word must be “PARDON”, if the probability for the prisoner getting to the throne room during his random walk is 100%, or “PRISON” otherwise.
    • the second word must be “LIMITED”, if a limit for the number of beaming operations exists, or “UNLIMITED” otherwise.

    样例输入

    3
    2
    2 3
    1
    3
    

    样例输出

    PARDON LIMITED
    分析:有向无环图判定及bfs;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define Lson L, mid, ls[rt]
    #define Rson mid+1, R, rs[rt]
    const int maxn=5e4+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    inline ll read()
    {
        ll x=0;int f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,k,t,vis[maxn],vis1[maxn],tot,tot1,h[maxn],u[maxn];
    struct node
    {
        int to,nxt;
    }e[1000001],f[1000001];
    void add(int x,int y)
    {
        tot++;
        e[tot].to=y;
        e[tot].nxt=h[x];
        h[x]=tot;
        tot1++;
        f[tot1].to=x;
        f[tot1].nxt=u[y];
        u[y]=tot1;
    }
    bool flag,flag1;
    void dfs(int now)
    {
        if(flag)return;
        vis[now]=-1;
        for(int i=h[now];i;i=e[i].nxt)
        {
            int x=e[i].to;
            if(vis[x]==-1)
            {
                flag=true;
                return;
            }
            else if(!vis[x])dfs(x);
        }
        vis[now]=1;
    }
    void bfs()
    {
        queue<int>p;p.push(1);vis[1]=1;
        while(!p.empty())
        {
            int q=p.front();p.pop();
            for(int i=h[q];i;i=e[i].nxt)
            {
                int x=e[i].to;
               if(!vis[x])p.push(x);vis[x]=1;
            }
        }
        p.push(n);
        vis1[n]=1;
        while(!p.empty())
        {
            int q=p.front();p.pop();
            for(int i=u[q];i;i=f[i].nxt)
            {
                int x=f[i].to;
                if(!vis1[x])
                {
                    p.push(x);vis1[x]=1;
                }
            }
        }
    }
    int main()
    {
        int i,j;
        scanf("%d",&n);
        rep(i,1,n-1)
        {
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d",&j);
                add(i,j);
            }
        }
        dfs(1);
        memset(vis,0,sizeof(vis));
        bfs();
        rep(i,1,n)if(vis[i]&&!vis1[i])flag1=true;
        if(!flag1)printf("PARDON ");
        else printf("PRISON ");
        if(flag)puts("UNLIMITED");
        else puts("LIMITED");
        //system("Pause");
        return 0;
    }
  • 相关阅读:
    SAP MM 采购发票上的金额小差异
    SAP MM 物料号到物料的库存转移过账里的差异
    SAP MM 采购附加费在收货以及发票过账时候的会计分录
    SAP MM 移动平均价的商品发票价格和采购订单价格差异的处理
    WPF 使用 VisualBrush 在 4k 加 200 DPI 设备上某些文本不渲染看不见问题
    dotnet 写一个支持层层继承属性的对象
    dotnet OpenXML 读取 PPT 内嵌 xlsx 格式 Excel 表格的信息
    WPF 在 .NET Core 3.1.19 版本 触摸笔迹偏移问题
    linux下将编译错误输出到一个文本文件
    浮点型(FLOAT)与CHAR型转换
  • 原文地址:https://www.cnblogs.com/dyzll/p/5935136.html
Copyright © 2011-2022 走看看