Untitled
By: a guest | Mar 21st, 2010 | Syntax:
C++ | Size: 1.57 KB | Hits: 79 | Expires: Never
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXD = 1010;
int D, m, n;
vector<int> E[MAXD];
vector<int> R[MAXD];
int dokaz[MAXD];
bool bio[MAXD];
bool state[MAXD];
vector<int> topo;
void init( int x ) {
if( bio[x] ) return;
bio[x] = true;
for( vector<int>::iterator it = E[x].begin(); it != E[x].end(); ++it ) init( *it );
topo.push_back( x );
}
void iskljuci( int x ) {
if( bio[x] ) return;
bio[x] = true;
state[x] = false;
for( vector<int>::iterator it = R[x].begin(); it != R[x].end(); ++it )
iskljuci( *it );
}
bool parent( int x ) {
for( vector<int>::iterator it = R[x].begin(); it != R[x].end(); ++it )
if( state[*it] ) return true;
return R[x].empty();
}
int main( void ) {
scanf( "%d %d %d", &D, &m, &n );
for( int i = 0; i < m; ++i ) {
int a, b; scanf( "%d %d", &a, &b ); --a, --b;
E[a].push_back( b );
R[b].push_back( a );
}
for( int i = 0; i < D; ++i ) init( i );
reverse( topo.begin(), topo.end() );
for( int i = 0; i < n; ++i ) {
scanf( "%d", &dokaz[i] );
--dokaz[i];
}
for( int i = 0; i < D; ++i ) {
for( int j = 0; j < D; ++j ) state[j] = true;
for( int j = 0; j < D; ++j ) bio[j] = false;
iskljuci( i );
for( vector<int>::iterator it = topo.begin(); it != topo.end(); ++it )
if( !parent( *it ) ) iskljuci( *it );
bool ok = true;
for( int j = 0; j < n && ok; ++j )
if( !state[ dokaz[j] ] ) ok = false;
if( !ok ) printf( "%d\n", i+1 );
}
return 0;
}