Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 21st, 2010 | Syntax: C++ | Size: 1.81 KB | Hits: 76 | Expires: Never
Copy text to clipboard
  1. #include <cstdio>
  2. #include <vector>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int MaxN = 2000;
  8.  
  9. int n, m, k, uk, x, a, b;
  10. int bio[ MaxN ], imam[ MaxN ][ MaxN ];
  11.  
  12. vector < int > V[ MaxN ];
  13. vector < int > R[ MaxN ];
  14. vector < int > IS;
  15.  
  16. void rek( int mj ) {
  17.         bio[ mj ] = 1;
  18.        
  19.         for( int i = 0; i < V[ mj ].size(); ++i ) if( !bio[ V[ mj ][ i ] ] ) rek( V[ mj ][ i ] );
  20.        
  21.         int sad;
  22.         for( int j = 0; j < uk; ++j )
  23.                 for( int i = 0; i < V[ mj ].size(); ++i ) imam[ mj ][ j ] |= imam[ V[ mj ][ i ] ][ j ];
  24.  
  25.        
  26.         imam[ mj ][ mj/32 ] |= ( 1<<( mj&31 ) );    
  27.        
  28.         return;
  29. }
  30.  
  31. void dfs( int mj ) {
  32.         bio[ mj ] = 1;
  33.        
  34.         for( int i = 0; i < R[ mj ].size(); ++i ) if( !bio[ R[ mj ][ i ] ] ) dfs( R[ mj ][ i ] );
  35.        
  36.         int sad;
  37.         for( int j = 0; j < uk; ++j ) {
  38.                 sad = ( 1ll<<32 ) - 1;
  39.                
  40.                 for( int i = 0; i < R[ mj ].size(); ++i ) sad &= imam[ R[ mj ][ i ] ][ j ];
  41.                 if( !R[ mj ].size() ) sad = 0;
  42.                
  43.                 imam[ mj ][ j ] |= sad;
  44.         }
  45.                
  46.         return;
  47. }
  48.  
  49. void find( int mj ) {
  50.         bio[ mj ] = 1;
  51.         IS.push_back( mj );
  52.        
  53.         for( int i = 0; i < n; ++i ) if( ( imam[ mj ][ i/32 ]&( 1<<( i&31 ) ) ) && !bio[ i ] ) find( i );
  54.        
  55.         return;
  56. }
  57.  
  58. int main( void ) {
  59.         scanf( "%d %d %d", &n, &m, &k );
  60.         for( int i = 0; i < m; ++i ) {
  61.                 scanf( "%d %d", &a, &b );
  62.                 --a; --b;
  63.                 V[ a ].push_back( b );
  64.                 R[ b ].push_back( a );
  65.         }
  66.        
  67.         uk = n/32 + 1;
  68.         for( int i = 0; i < n; ++i ) if( !bio[ i ] ) rek( i );
  69.         memset( bio, 0, sizeof bio );
  70.         for( int i = 0; i < n; ++i ) if( !bio[ i ] ) dfs( i );
  71.         memset( bio, 0, sizeof bio );
  72.        
  73.         for( int i = 0; i < k; ++i ) {
  74.                 scanf( "%d", &x ); --x;
  75.                 if( bio[ x ] ) continue;
  76.                 find( x );
  77.         }
  78.        
  79.         sort( IS.begin(), IS.end() );
  80.        
  81.         for( int i = 0; i < IS.size(); ++i ) {
  82.                 if( i ) printf( " " );
  83.                 printf( "%d", IS[ i ]+1 );
  84.         }
  85.         printf( "\n" );
  86.        
  87.         return 0;
  88. }