2186(2)

1 // include file
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6 #include <cctype>
7 #include <ctime>
8
9 #include <iostream>
10 #include <sstream>
11 #include <fstream>
12 #include <iomanip>
13 #include <bitset>
14 #include <strstream>
15
16 #include <algorithm>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <set>
21 #include <list>
22 #include <functional>
23
24 using namespace std;
25
26 // typedef
27 typedef long long LL;
28 typedef unsigned long long ULL;
29
30 //
31 #define read freopen("in.txt","r",stdin)
32 #define write freopen("out.txt","w",stdout)
33 #define FORi(a,b) for(int i=(a);i<(b);i++)
34 #define FORj(a,b) for(int j=(a);j<(b);j++)
35 #define FF(i,a) for(int i=0;i<(a);i+++)
36 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
37 #define Z(a) (a<<1)
38 #define Y(a) (a>>1)
39
40 const double eps = 1e-11;
41 const double Pi = acos(-1.0);
42
43 template<class T> inline T sqr(T a){return a*a;}
44 template<class T> inline T TMAX(T x,T y)
45 {
46 if(x>y) return x;
47 return y;
48 }
49 template<class T> inline T MMAX(T x,T y,T z)
50 {
51 return TMAX(TMAX(x,y),z);
52 }
53
54 // code begin
55 #define MAXN 10001
56
57 vector<int> G[MAXN];
58 vector<int> RG[MAXN];
59 vector<int> NG[MAXN];
60
61 int scc;
62 int used[MAXN];
63 int dfn[MAXN];
64 int low[MAXN];
65 int stk[MAXN],top;
66 bool isin[MAXN];
67 int id[MAXN];
68 int idsz[MAXN];
69 int cnt;
70 int n,m;
71
72 void tarjan_scc(int i)
73 {
74 dfn[i] = cnt;
75 low[i] = cnt;
76 cnt++;
77 stk[top++] = i;
78 isin[i] = true;
79 used[i] = true;
80
81 FORj(0,G[i].size())
82 {
83 if(!used[G[i][j]])
84 {
85 tarjan_scc( G[i][j] );
86 low[i] = min(low[i],low[G[i][j]]);
87 }
88 else if(isin[ G[i][j] ])
89 {
90 low[i] = min(low[i],dfn[ G[i][j] ]);
91 }
92 }
93
94 if(low[i]==dfn[i])
95 {
96 int w;
97 do
98 {
99 w = stk[--top];
100 isin[w] = false;
101 id[w] = scc;
102 idsz[scc]++;
103 }while(w!=i);
104 scc++;
105 }
106 }
107
108 int main()
109 {
110 read;
111 write;
112 while(scanf("%d %d",&n,&m)==2)
113 {
114 FORi(1,n+1)
115 {
116 G[i].clear();
117 RG[i].clear();
118 }
119
120 int a,b;
121 while(m--)
122 {
123 scanf("%d %d",&a,&b);
124 G[a].push_back(b);
125 RG[b].push_back(a);
126 }
127
128 //这里运行tarjan的scc算法
129 memset(used,0,sizeof(used));
130 memset(dfn,0,sizeof(dfn));
131 memset(low,0,sizeof(low));
132 memset(isin,0,sizeof(isin));
133 cnt = 1;
134 top = 0;
135 scc = 1;
136 FORi(1,n+1)
137 {
138 if(!used[i])
139 {
140 tarjan_scc(i);
141 }
142 }
143
144 FORi(1,scc)
145 {
146 NG[i].clear();
147 }
148
149 FORi(1,n+1)
150 {
151 FORj(0,G[i].size())
152 {
153 if( id[ i ]!=id[ G[i][j] ] )
154 {
155 NG[ id[i] ].push_back( id[G[i][j]] );
156 }
157 }
158 }
159
160 int ans = 0,dx;
161 FORi(1,scc)
162 {
163 if(NG[i].size()==0)
164 {
165 ans++;
166 dx=i;
167 }
168 }
169
170 if(ans==1)
171 {
172 printf("%d\n",idsz[dx]);
173 }
174 else
175 printf("0\n");
176 }
177 }
posted @ 2011-02-27 23:25  AC2012  阅读(188)  评论(0编辑  收藏  举报