2186(3)

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 stk1[MAXN],top1;
65 int stk2[MAXN],top2;
66 bool isin[MAXN];
67 int id[MAXN];
68 int idsz[MAXN];
69 int cnt;
70 int n,m;
71
72
73
74 void gabow_scc(int i)
75 {
76 dfn[i] = cnt++;
77 stk1[top1++] = i;
78 stk2[top2++] = i;
79 used[i] = true;
80 isin[i] = true;
81
82 FORj(0,G[i].size())
83 {
84 if( !used[G[i][j]] )
85 {
86 gabow_scc(G[i][j]);
87 }
88 else if( isin[G[i][j]] )
89 {
90 // 去除stk2中dfn比G[i][j]大的
91 while(top2>0&&dfn[stk2[top2-1]]>dfn[G[i][j]])
92 {
93 top2--;
94 }
95 }
96 }
97
98 if(i==stk2[top2-1])
99 {
100 top2--;
101 // 取出这个scc
102 int w;
103 do
104 {
105 w = stk1[--top1];
106 isin[w] = false;
107 id[w] = scc;
108 idsz[scc]++;
109 }while(w!=i);
110
111 scc++;
112 }
113 }
114
115 int main()
116 {
117 read;
118 write;
119 while(scanf("%d %d",&n,&m)==2)
120 {
121 FORi(1,n+1)
122 {
123 G[i].clear();
124 RG[i].clear();
125 }
126
127 int a,b;
128 while(m--)
129 {
130 scanf("%d %d",&a,&b);
131 G[a].push_back(b);
132 RG[b].push_back(a);
133 }
134
135 //这里运行gabow的scc算法
136 memset(used,0,sizeof(used));
137 top1=top2=0;
138 memset(id,0,sizeof(id));
139 memset(idsz,0,sizeof(idsz));
140 memset(dfn,0,sizeof(dfn));
141 memset(isin,0,sizeof(isin));
142 scc = 1;
143 cnt = 1;
144 FORi(1,n+1)
145 {
146 if(!used[i])
147 {
148 gabow_scc(i);
149 }
150 }
151
152 //运行结束
153
154 FORi(1,scc)
155 {
156 NG[i].clear();
157 }
158
159 FORi(1,n+1)
160 {
161 FORj(0,G[i].size())
162 {
163 if( id[ i ]!=id[ G[i][j] ] )
164 {
165 NG[ id[i] ].push_back( id[G[i][j]] );
166 }
167 }
168 }
169
170 int ans = 0,dx;
171 FORi(1,scc)
172 {
173 if(NG[i].size()==0)
174 {
175 ans++;
176 dx=i;
177 }
178 }
179
180 if(ans==1)
181 {
182 printf("%d\n",idsz[dx]);
183 }
184 else
185 printf("0\n");
186 }
187 return 0;
188 }
posted @ 2011-02-28 14:26  AC2012  阅读(195)  评论(0编辑  收藏  举报