2833 奇怪的梦境

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<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 const int Maxn=1000000;
 6 struct Stack{
 7     int sz[Maxn];
 8     int top;
 9     int front()
10     {
11         return sz[top];
12     }
13     void pop()
14     {
15         top--;
16     }
17     void push(int x)
18     {
19          sz[++top]=x;      
20     }
21     int size()
22     {
23         return top;
24     }
25 }stack;
26 struct Node{
27     int u,v,w,next;
28     int rd;
29 }edge[Maxn];
30 int head[Maxn];
31 int n,m;
32 int num=1;
33 int rd[Maxn];
34 void Add(int x,int y)
35 {
36     edge[num].u=x;
37     edge[num].v=y;
38     //edge[num].w=z;
39     edge[num].next=head[x];
40     rd[y]++;
41     head[x]=num++;
42 }
43 void work()
44 {
45     int tot=0;
46     for(int i=1;i<=m;i++)
47      {
48          int x,y;
49          cin>>x>>y;
50          Add(x,y);
51      }
52      for(int i=1;i<=n;i++)
53       {
54           if(rd[i]==0)
55            {
56                stack.push(i);
57                tot++;
58            }
59       }
60       while(stack.size()!=0)
61        {
62            int p=stack.front();
63            stack.pop();
64            for(int i=head[p];i!=-1;i=edge[i].next)
65             {
66                 rd[edge[i].v]--;
67                 if(rd[edge[i].v]==0)
68                  {
69                      stack.push(edge[i].v);
70                      tot++;
71                  }
72             }
73        }
74        if(tot==n)
75         {
76             cout<<"o(∩_∩)o";
77             exit(0);
78             //return 0;
79         }
80         else
81         {
82             cout<<"T_T"<<endl<<n-tot;
83             exit(0);
84             //return 0;
85         }
86 }
87 int main()
88 {
89     cin>>n>>m;
90     for(int i=1;i<=n;i++)
91      {
92          head[i]=-1;
93      }
94     work();
95 }

 

posted @ 2017-04-17 14:51  ioioioioioio  阅读(135)  评论(0编辑  收藏  举报