Untitled
By: a guest | Mar 21st, 2010 | Syntax:
C++ | Size: 1.81 KB | Hits: 76 | Expires: Never
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int MaxN = 2000;
int n, m, k, uk, x, a, b;
int bio[ MaxN ], imam[ MaxN ][ MaxN ];
vector < int > V[ MaxN ];
vector < int > R[ MaxN ];
vector < int > IS;
void rek( int mj ) {
bio[ mj ] = 1;
for( int i = 0; i < V[ mj ].size(); ++i ) if( !bio[ V[ mj ][ i ] ] ) rek( V[ mj ][ i ] );
int sad;
for( int j = 0; j < uk; ++j )
for( int i = 0; i < V[ mj ].size(); ++i ) imam[ mj ][ j ] |= imam[ V[ mj ][ i ] ][ j ];
imam[ mj ][ mj/32 ] |= ( 1<<( mj&31 ) );
return;
}
void dfs( int mj ) {
bio[ mj ] = 1;
for( int i = 0; i < R[ mj ].size(); ++i ) if( !bio[ R[ mj ][ i ] ] ) dfs( R[ mj ][ i ] );
int sad;
for( int j = 0; j < uk; ++j ) {
sad = ( 1ll<<32 ) - 1;
for( int i = 0; i < R[ mj ].size(); ++i ) sad &= imam[ R[ mj ][ i ] ][ j ];
if( !R[ mj ].size() ) sad = 0;
imam[ mj ][ j ] |= sad;
}
return;
}
void find( int mj ) {
bio[ mj ] = 1;
IS.push_back( mj );
for( int i = 0; i < n; ++i ) if( ( imam[ mj ][ i/32 ]&( 1<<( i&31 ) ) ) && !bio[ i ] ) find( i );
return;
}
int main( void ) {
scanf( "%d %d %d", &n, &m, &k );
for( int i = 0; i < m; ++i ) {
scanf( "%d %d", &a, &b );
--a; --b;
V[ a ].push_back( b );
R[ b ].push_back( a );
}
uk = n/32 + 1;
for( int i = 0; i < n; ++i ) if( !bio[ i ] ) rek( i );
memset( bio, 0, sizeof bio );
for( int i = 0; i < n; ++i ) if( !bio[ i ] ) dfs( i );
memset( bio, 0, sizeof bio );
for( int i = 0; i < k; ++i ) {
scanf( "%d", &x ); --x;
if( bio[ x ] ) continue;
find( x );
}
sort( IS.begin(), IS.end() );
for( int i = 0; i < IS.size(); ++i ) {
if( i ) printf( " " );
printf( "%d", IS[ i ]+1 );
}
printf( "\n" );
return 0;
}