1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <bits/stdc++.h> using namespace std;
const int maxn = 1e4 + 50; vector< int > adj[ maxn ]; int dfn[ maxn ], low[ maxn ], idx; int scc_id[ maxn ], scc_cnt; bool in_stk[ maxn ]; stack< int > stk; int ind[ maxn ], outd[ maxn ], n;
void tarjan( int u ) { dfn[ u ] = low[ u ] = ++ idx; stk.push( u ); in_stk[ u ] = 1;
for( int v : adj[ u ] ) { if( ! dfn[ v ] ) { tarjan( v ); low[ u ] = min( low[ u ], low[ v ] ); } else if( in_stk[ v ] ) { low[ u ] = min( low[ u ], dfn[ v ] ); } }
if( dfn[ u ] == low[ u ] ) { ++ scc_cnt; int v; do { v = stk.top( ); stk.pop( ); in_stk[ v ] = 0; scc_id[ v ] = scc_cnt; } while( v != u ); } }
int main( ) { ios::sync_with_stdio( 0 ); cin.tie( 0 );
cin >> n; for( int i = 1; i <= n; ++ i ) { int v; while( cin >> v && v != 0 ) adj[i].push_back( v ); }
for( int i = 1; i <= n; ++ i ) { if( ! dfn[i] ) tarjan( i ); }
for( int u = 1; u <= n; ++ u ) { for( int v : adj[ u ] ) { if( scc_id[ u ] != scc_id[ v ] ) { ++ ind[ scc_id[ v ] ]; ++ outd[ scc_id[ u ] ]; } } }
int ins = 0, outs = 0; for( int i = 1; i <= scc_cnt; ++ i ) { if( ind[i] == 0 ) ++ ins; if( outd[i] == 0 ) ++ outs; }
cout << ins << "\n"; if( scc_cnt == 1 ) cout << 0 << "\n"; else cout << max( ins, outs ) << "\n";
return 0; }
|