深搜一下,看存不存在反向边,然后就可以判断是不是DAG了。
Run Time: 0sec
Run Memory: 316KB
Code length: 900Bytes
SubmitTime: 2011-12-27 11:59:50
// Problem#: 4433
// Submission#: 1136706
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
int u, v;
bool DAG;
bool edge[ 101 ][ 101 ];
int visited[ 101 ];
void DFS( int i ) {
for ( int j = 1; DAG && j <= n; j++ ) {
if ( edge[ i ][ j ] ) {
if ( visited[ j ] == 0 ) {
visited[ j ] = 1;
DFS( j );
}
else if ( visited[ j ] == 1 )
DAG = false;
}
}
visited[ i ] = 2;
}
int main()
{
memset( edge, false, sizeof( edge ) );
memset( visited, 0, sizeof( visited ) );
scanf( "%d%d", &n, &m );
while ( m-- ) {
scanf( "%d%d", &u, &v );
edge[ u ][ v ] = true;
}
DAG = true;
for ( int i = 1; DAG && i <= n; i++ ) {
if ( visited[ i ] == 0 ) {
visited[ i ] = 1;
DFS( i );
}
}
printf( DAG ? "1\n": "0\n" );
return 0;
}