CSU 1526: Beam me out!

题意:第一问:从1出发,是不是会走进一个点,然后再也到不了n。

第二问:是不是存在一个环,从1出发可以走到。

对于第一问,我们可以先缩点,然后看看是不是只有一个点,出度为0,还有注意这个点包含n

对于第二问,如果访问的点数sum等于缩点以后的点数,那么就是没有环了。

这里需要注意的是,特判自环......wa成狗

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#define LL long long
#define maxn 50010
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;

int pre[maxn],low[maxn],dfs_time,n,cnt;
int scc[maxn] ;
bool vi[maxn],flag,hehe;
stack<int>s;
vector<int>qe[maxn] ;
void dfs( int u )
{
    pre[u] = low[u] = ++dfs_time ;
    int i , v ;
    s.push(u) ;
    vi[u] = 1 ;
    if(u==n) flag=true;
    for( i = 0 ; i < qe[u].size() ; i++ )
    {
        v = qe[u][i] ;
        if(v==u)hehe=true;
        if(!pre[v]){
            dfs(v) ;
             low[u] = min(low[u],low[v]) ;
        }
        if( vi[v] && pre[v] < low[u])
            low[u] = pre[v] ;
    }
    if(pre[u] == low[u])
    {
        cnt++ ;
        while(1)
        {
            v = s.top() ; s.pop() ;
            vi[v] = 0 ;
            scc[v]=cnt;
            if(v==u) break ;
        }
    }
    return ;
}
void solve(int n)
{
    memset(pre,0,sizeof(pre)) ;
    memset(vi,0,sizeof(vi)) ;
    while(!s.empty())s.pop();
    dfs_time=cnt=0;
    flag=false;
    dfs(1) ;
    memset(vi,0,sizeof(vi)) ;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<qe[i].size();j++)
        {
            int v=qe[i][j] ;
            if(scc[v]!=scc[i])
            {
                vi[scc[i]]=1;
            }
        }
    }
    int cnt1=0;
    for(int i=1;i<=cnt;i++)if(!vi[i])
        cnt1++ ;
    if(cnt1==1&&flag)printf("PARDON ");
    else printf("PRISON ");
    cnt1=0;
    for(int i=1;i<=n;i++)if(pre[i])
    {
        cnt1++ ;
    }
    if(cnt1==cnt&&!hehe)puts("LIMITED");
    else puts("UNLIMITED");
}
int main()
{
    int sz,i,j,k;
    int t,ans,m ;
     while(scanf("%d",&n)!=EOF){
        hehe=false;
        for(i=1;i<=n;i++)qe[i].clear();
        for(i=1;i<n;i++)
        {
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d",&k) ;
                qe[i].push_back(k) ;
            }
        }
        solve(n) ;
     }
    return 0;
}

时间: 2024-12-26 05:58:37

CSU 1526: Beam me out!的相关文章

CSU 1526 Beam me out! 强连通

题目链接:点击打开链接 题意: 给定n个点的有向图(1为起点,n为终点) 下面每两行给出一个点的出度和所连接的下一个点. 第n个点是没有出度的 图是这样的: 1->2, 1->3, 2->3 第一问: 若存在一种方案使得这个人进入一个点后再也不能到达终点则输出 PRISON , 否则输出 PARDON 第二问: 若这个人可以在图里走无穷步则输出UNLIMITED, 否则输出LIMITED #include <iostream> #include <cstdio>

CSUOJ 1526 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 de

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

CSU 1111: 三家人【有趣的思维题】

1111: 三家人 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 2241  Solved: 874 [Submit][Status][Web Board] Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请问这笔钱如何分给A.B 二位太太较为恰当?A 应得多少元?90/(5+4)*5=$50

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In

CSU 1416 Practical Number

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416 结论题,具体判断方法请点击这个网址. 筛素数是肯定的,但一开始定的范围太大了,想当然要筛到10^9的质数,但仔细想想,只要到sqrt(10^9)就可以了,最后的那一个质数是最后一步的比较,不用筛出来. #include <stdio.h> #include <string.h> #include <iostream> using namespace st

CSU 1412 Line and Circles

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412 题目要求判断是否有一条直线可以穿过所有的圆. 做法:把所有圆心做一次凸包,然后判断这个凸包是否能通过一个宽度为2*R的通道. 做法和求凸包直径差不多,只是判断的时候把点到两个端点的距离换成点到直线的距离. #include <stdio.h> #include <string.h> #include <math.h> #include <stdli

51Nod 1526 分配 笔名

1526 分配 笔名 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题  收藏  关注 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名为a,真名为b,则他们之间的相关度为lcp(a,b).那么我们就可以得到匹配的质量是每一个同学笔名和真名之间相关度的和. 现在要求分配笔名,使得匹配质

CSU 1547 Rectangle(dp、01背包)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectangles. The area of these rectangles is 1* x or 2 * x ,and now you need find a big enough rectangle( 2 * m) so that you can put all rectangles into it(th