2186

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