Pagini recente » Cod sursa (job #615559) | Cod sursa (job #403575) | Cod sursa (job #2977171) | Cod sursa (job #843298) | Cod sursa (job #952319)
Cod sursa(job #952319)
#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;
}