#include <cstdio>
#include 
<vector>

using namespace std;

#define MAXN 10010

int n, m;
vector
<int> mapa[MAXN], mapb[MAXN];
bool visite[MAXN];
int  post[MAXN], num[MAXN],size[MAXN], in[MAXN], cnt= 0, c= 0, s= 0;

void dfs( int u )
{
    visite[u]
= true;
    
    
for( size_t i= 0; i< mapb[u].size(); ++i )
    
if!visite[ mapb[u][i] ] ) dfs( mapb[u][i] );
    
    post[cnt
++]= u;
}

void Ddfs( int u, int id )
{
    visite[u]
= true
    num[u]
= id; s++;
    
    
for( size_t i= 0; i< mapa[u].size(); ++i )
    
if!visite[ mapa[u][i] ] ) 
        Ddfs( mapa[u][i], id );
}

void run()
{
    memset( visite, 
falsesizeof(visite) );
    cnt
= 0; c= 0;
    
    
forint i= 1; i<= n; ++i )
    
if!visite[i] ) dfs( i );
    
    memset( visite, 
falsesizeof(visite) );
    memset( size, 
0sizeof(size) );
    
    
forint i= cnt- 1; i>= 0; i-- )
    
if!visite[ post[i] ] )
    {
         s
= 0;
         Ddfs( post[i], 
++c );
         
         size[c]
= s;
    }
}

void degree()
{
    memset( 
in0sizeof(in) );
    
    
forint i= 1; i<= n; ++i )
        
for( size_t j= 0; j< mapa[i].size(); ++j )
        
if( num[i]!= num[ mapa[i][j] ] )
            
in[ num[i] ]++;
    
    
int nu= 0, k;
    
forint i= 1; i<= c; ++i )
    
ifin[i]== 0 ) k= i, nu++;
    
    
if( nu!= 1 ) puts("0");
    
else         printf("%d\n", size[k] );
}

int main()
{
    scanf(
"%d%d",&n,&m );
    
    
forint i= 0; i< m; ++i )
    {
        
int u, v;
        scanf(
"%d%d",&u,&v );
        
        mapa[u].push_back( v );
        mapb[v].push_back( u );
    }
    
    run();
    degree();
    
    
return 0;
}
posted on 2008-12-05 20:21 Darren 阅读(414) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理