Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 21st, 2010 | Syntax: C++ | Size: 1.57 KB | Hits: 79 | Expires: Never
Copy text to clipboard
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int MAXD = 1010;
  8.  
  9. int D, m, n;
  10.  
  11. vector<int> E[MAXD];
  12. vector<int> R[MAXD];
  13. int dokaz[MAXD];
  14.  
  15. bool bio[MAXD];
  16. bool state[MAXD];
  17. vector<int> topo;
  18.  
  19. void init( int x ) {
  20.   if( bio[x] ) return;
  21.   bio[x] = true;
  22.  
  23.   for( vector<int>::iterator it = E[x].begin(); it != E[x].end(); ++it ) init( *it );
  24.   topo.push_back( x );
  25. }
  26.  
  27. void iskljuci( int x ) {
  28.   if( bio[x] ) return;
  29.   bio[x] = true;
  30.  
  31.   state[x] = false;
  32.   for( vector<int>::iterator it = R[x].begin(); it != R[x].end(); ++it )
  33.     iskljuci( *it );
  34. }
  35.  
  36. bool parent( int x ) {
  37.   for( vector<int>::iterator it = R[x].begin(); it != R[x].end(); ++it )
  38.     if( state[*it] ) return true;
  39.   return R[x].empty();
  40. }
  41.  
  42. int main( void ) {
  43.   scanf( "%d %d %d", &D, &m, &n );
  44.  
  45.   for( int i = 0; i < m; ++i ) {
  46.     int a, b; scanf( "%d %d", &a, &b ); --a, --b;
  47.     E[a].push_back( b );
  48.     R[b].push_back( a );
  49.   }
  50.  
  51.   for( int i = 0; i < D; ++i ) init( i );
  52.   reverse( topo.begin(), topo.end() );
  53.  
  54.   for( int i = 0; i < n; ++i ) {
  55.     scanf( "%d", &dokaz[i] );
  56.     --dokaz[i];
  57.   }
  58.  
  59.   for( int i = 0; i < D; ++i ) {
  60.     for( int j = 0; j < D; ++j ) state[j] = true;
  61.     for( int j = 0; j < D; ++j ) bio[j] = false;
  62.  
  63.     iskljuci( i );
  64.     for( vector<int>::iterator it = topo.begin(); it != topo.end(); ++it )
  65.       if( !parent( *it ) ) iskljuci( *it );
  66.  
  67.     bool ok = true;
  68.     for( int j = 0; j < n && ok; ++j )
  69.       if( !state[ dokaz[j] ] ) ok = false;
  70.     if( !ok ) printf( "%d\n", i+1 );
  71.   }
  72.  
  73.   return 0;
  74. }