• CODEVS——T 2833 奇怪的梦境


    http://codevs.cn/problem/2833/

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息。屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下。可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断。

    输入描述 Input Description

    第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息。

    接下来的M行,每行两个数ai,bi,表示bi按钮要在ai之后按下。所给信息可能有重复,保证ai≠bi。

    输出描述 Output Description

    若按钮能全部按下,则输出“o(∩_∩)o”。

    若不能,第一行输出“T_T”,第二行输出因信息有矛盾而无法确认按下顺序的按钮的个数。输出不包括引号。

    样例输入 Sample Input

    3 3

    1 2

    2 3

    3 2

    样例输出 Sample Output

    T_T

    2

    数据范围及提示 Data Size & Hint

    对于30%的数据,保证0<N≤100。

    对于50%的数据,保证0<N≤2000。

    对于70%的数据,保证0<N≤5000。

    对于100%的数据,保证0<N≤10000,0<M≤2.5N。

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 const int N(10000+5);
     7 const int M(30000+5);
     8 int head[N],sumedge;
     9 struct Edge
    10 {
    11     int v,next;
    12     Edge(int v=0,int next=0):v(v),next(next){}
    13 }edge[M];
    14 inline void ins(int u,int v)
    15 {
    16     edge[++sumedge]=Edge(v,head[u]);
    17     head[u]=sumedge;
    18 }
    19 
    20 int tim,dfn[N],low[N];
    21 int top,Stack[N],instack[N];
    22 int sumcol,col[N],point[N];
    23 void DFS(int now)
    24 {
    25     low[now]=dfn[now]=++tim;
    26     Stack[++top]=now;instack[now]=1;
    27     for(int v,i=head[now];i;i=edge[i].next)
    28     {
    29         v=edge[i].v;
    30         if(!dfn[v]) DFS(v),low[now]=min(low[now],low[v]);
    31         else if(instack[v]) low[now]=min(low[now],dfn[v]);
    32     }
    33     if(low[now]==dfn[now])
    34     {
    35         col[now]=++sumcol;
    36         point[sumcol]++;
    37         for(;Stack[top]!=now;top--)
    38         {
    39             col[Stack[top]]=sumcol;
    40             point[sumcol]++;
    41             instack[Stack[top]]=0;
    42         }
    43         top--; instack[now]=0;
    44     }
    45 }
    46 
    47 int main()
    48 {
    49     int n,m,ans=0;
    50     scanf("%d%d",&n,&m);
    51     for(int u,v;m--;)
    52         scanf("%d%d",&u,&v),ins(u,v);
    53     DFS(1);
    54     for(int i=1;i<=n;i++) if(!dfn[i])
    55     for(int i=1;i<=sumcol;i++)
    56         if(point[i]>1) ans+=point[i];
    57     if(ans) printf("T_T
    %d",ans);
    58     else printf("o(∩_∩)o");
    59     return 0;
    60 }
    只A掉样例的Tarjan、

    拓扑排序求环内点数

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 const int N(10000+5);
     8 const int M(30000+5);
     9 
    10 queue<int>que;
    11 int rd[N],head[N],sumedge;
    12 struct Edge
    13 {
    14     int v,next;
    15     Edge(int v=0,int next=0):v(v),next(next){}
    16 }edge[M];
    17 inline void ins(int u,int v)
    18 {
    19     edge[++sumedge]=Edge(v,head[u]);
    20     head[u]=sumedge;
    21 }
    22 
    23 int main()
    24 {
    25     int n,m;
    26     scanf("%d%d",&n,&m);
    27     int ans=n;
    28     for(int u,v;m--;)
    29         scanf("%d%d",&u,&v),ins(u,v),rd[v]++;
    30     for(int i=1;i<=n;i++)
    31         if(!rd[i]) que.push(i);
    32     for(int u,v;!que.empty();)
    33     {
    34         ans--;
    35         u=que.front(); que.pop();
    36         for(int i=head[u];i;i=edge[i].next)
    37         {
    38             v=edge[i].v;
    39             if(--rd[v]==0) que.push(v);
    40         }
    41     }
    42     if(!ans) printf("o(∩_∩)o");
    43     else printf("T_T
    %d",ans);
    44     return 0;
    45 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Python中的sorted函数以及operator.itemgetter函数
    a=a+(a++);b=b+(++b);计算顺序,反汇编
    带基虚类的构造函数执行顺序
    开源系统管理资源大合辑
    linux的LNMP架构介绍、MySQL安装、PHP安装
    lamp下mysql安全加固
    ITSS相关的名词解释
    从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
    Linux 文件系统概览
    Exchange2010批量删除邮件
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7418877.html
Copyright © 2020-2023  润新知