Cod sursa(job #952319)

Utilizator Mr2peuMaxim Valentin-Constantin Mr2peu Data 23 mai 2013 01:06:43
Problema Componente tare conexe Scor 88
Compilator cpp Status done
Runda Arhiva educationala Marime 3.05 kb
#include <iostream>
#include <fstream>
 
using namespace std ;

#define Nmax 100100

class CTC {

	struct nod
	{
	 int info;
	 nod *next;
	} ;
		 
	nod *p[Nmax];
	nod *pt[Nmax];
	int n , m , nr , com ;
	int viz[Nmax] , postordine[Nmax] ,
		rev[Nmax] ;

	void adauga_normal ( int j , int k ) ;

	void adauga_invers (int j , int k ) ;

	void DFS ( int i ) ;

	void DFST ( int i ) ;

	void revizit ( int i ) ;

	void afis ( int i ) ;


public:


	CTC ()
	{
		    scanf ( "%d%d" , &n , &m ) ;
			nr , com = 0 ;
	}


	void adaug () ;

	void DepthFS () ;

	void DepthFST () ;

	void vizitiar () ;

	void afisez () ;

} ;

void CTC::adauga_normal ( int j , int k )
{
    nod *elem = new nod ;
    elem->info = k ;
    elem->next = p[j] ;
    p[j] = elem ;
}
 
void CTC::adauga_invers ( int j , int k )
{
    nod *elem = new nod ;
    elem->info = k ;
    elem->next = pt[j] ;
    pt[j] = elem ;
}
 
void CTC::DFS ( int i )
{
    nod *current = p[i] ;
    viz[i] = 1 ;
    while( current != NULL )
        {
            if( viz[current->info] == 0 )
                DFS(current->info) ;
            current = current->next ;
        }
    postordine[++nr] = i ;
}
 
void CTC::DFST ( int i )
{
    nod *current = pt[i] ;
    viz[i] = 0 ;
    adauga_normal ( n+com , i ) ;
    while( current != NULL )
        {
            if( viz[current->info] != 0 )
                DFST(current->info) ;
            current = current->next ;
        }
}
 
void CTC::revizit(int i)
{
    nod *current = pt[i] ;
    rev[i] = 1 ;
    while( current != NULL )
        {
            if( rev[current->info] == 0 )
                revizit( current->info ) ;
            current = current->next ;
        }
}
 
void CTC::afis(int i)
{
    nod *current = p[i] ;
    while( current )
        {
            printf( "%d " , current->info ) ;
            current = current->next ;
        }
}

void CTC::adaug ()
{
	int i,x,y;
    for (i=1;i<=m;++i)
        {
            scanf ( "%d%d" , &x , &y ) ;
            adauga_normal ( x , y ) ;
            adauga_invers ( y , x ) ;
        }
} 

void CTC::DepthFS ()
{
		for ( int i = 1 ; i <= n ; ++i )
        {
            if ( viz[i] == 0 )
                DFS ( i ) ;
        }
} 

void CTC::DepthFST ()
{
	for ( int i = n ; i > 0 ; --i )
        if ( viz[postordine[i]] != 0 )
            {
                ++com ;
                DFST ( postordine[i] ) ;
            }
}

void CTC::vizitiar ()
{
	for ( int i = n ; i > 0 ; --i )
        if ( rev[postordine[i]] == 0 )
            {
                ++com ;
                revizit ( i ) ;
            }
}

void CTC::afisez() 
{
	printf ( "%d\n" , com ) ;
    for ( int i = 1 ; i <= com ; ++i , printf("\n") )
        for ( nod *it = p[n+i] ; it ; it = it->next )
            printf ( "%d " , it->info ) ;

}

int main()
{
	
    freopen("ctc.in","r",stdin);
    freopen("ctc.out","w",stdout);

	CTC A ;
	
	A.adaug() ;
	A.DepthFS() ;
	A.DepthFST() ;
	A.afisez() ;

    return 0;
}