2553

1 /*
2 用到强连通分量算法,缩图。构建新图,查看出度为0的点,可以有多个出度为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 FORDi(a,b) for(int i=(a)-1;i>=0;i--)
39
40 #define FF(i,a) for(int i=0;i<(a);i+++)
41 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
42 #define Z(a) (a<<1)
43 #define Y(a) (a>>1)
44
45 const double eps = 1e-11;
46 const double Pi = acos(-1.0);
47
48 template<class T> inline T sqr(T a){return a*a;}
49 template<class T> inline T TMAX(T x,T y)
50 {
51 if(x>y) return x;
52 return y;
53 }
54 template<class T> inline T MMAX(T x,T y,T z)
55 {
56 return TMAX(TMAX(x,y),z);
57 }
58
59 // code begin
60 #define MAXN 5001
61
62 vector<int> G[MAXN];
63 vector<int> RG[MAXN];
64 vector<int> NG[MAXN];
65
66 int scc;
67 int stk[MAXN],top;
68 int id[MAXN];
69 int used[MAXN];
70
71 vector<int> ans;
72
73 int n,m;
74
75 void dfs(int i)
76 {
77 used[i] = 1;
78 int sz = G[i].size();
79 FORj(0,sz)
80 {
81 if( !used[ G[i][j] ] )
82 {
83 dfs(G[i][j]);
84 }
85 }
86 stk[top++] = i;
87 }
88
89 void rdfs(int i)
90 {
91 used[i] = 1;
92 id[i] = scc;
93 int sz = RG[i].size();
94 FORj(0,sz)
95 {
96 if( !used[ RG[i][j] ] )
97 {
98 rdfs( RG[i][j] );
99 }
100 }
101 }
102
103 int main()
104 {
105 read;
106 write;
107 while(scanf("%d",&n)==1)
108 {
109 if(n==0) break;
110 scanf("%d",&m);
111
112 FORi(1,n+1)
113 {
114 G[i].clear();
115 RG[i].clear();
116 }
117
118 int a,b;
119 while(m--)
120 {
121 scanf("%d %d",&a,&b);
122 G[a].push_back(b);
123 RG[b].push_back(a);
124 }
125
126 top = 0;
127 memset(used,0,sizeof(used));
128 FORi(1,n+1)
129 {
130 if(!used[i])
131 {
132 dfs(i);
133 }
134 }
135
136 memset(used,0,sizeof(used));
137 memset(id,0,sizeof(id));
138 scc = 1;
139 FORDi(top,0)
140 {
141 if(!used[ stk[i] ])
142 {
143 rdfs( stk[i] );
144 scc ++;
145 }
146 }
147
148 FORi(1,scc)
149 {
150 NG[i].clear();
151 }
152 FORi(1,n+1)
153 {
154 FORj(0,G[i].size())
155 {
156 if( id[ i ]!=id[ G[i][j] ] )
157 {
158 NG[ id[i] ].push_back( id[ G[i][j] ] );
159 }
160 }
161 }
162
163 ans.clear();
164 FORi(1,scc)
165 {
166 if( NG[i].size()==0 )
167 {
168 FORj(1,n+1)
169 {
170 if( id[j]==i )
171 {
172 ans.push_back(j);
173 }
174 }
175 }
176 }
177
178 sort(ans.begin(),ans.end());
179 printf("%d",ans[0]);
180 FORi(1,ans.size())
181 {
182 printf(" %d",ans[i]);
183 }
184 printf("\n");
185 }
186 return 0;
187 }
posted @ 2011-02-27 15:54  AC2012  阅读(767)  评论(0编辑  收藏  举报