Cod sursa(job #246875)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 21 ianuarie 2009 18:51:49
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream.h>
#include <fstream.h>

#define IN "ctc.in"
#define OUT "ctc.out"
#define maxx 250100

ifstream fin(IN);
ofstream fout(OUT);

int n,m;
struct lista
{
 int nod;
 lista *urm;
}*g[maxx],*gt[maxx];
int u[maxx];
int st[maxx];
int nst;

void citire();
void add(int x,int y,int alt);
void df1(int nod);
void df20(int nod);
void df21(int nod);

void afis()
{
 int i;
 lista *q;

 for(i=1;i<=n;i++)
 {
  q=g[i];
  fout<<i<<"   ";
  while(q)
  {
   fout<<q->nod<<" ";
   q=q->urm;
  }
  fout<<endl;
 }
}

int main()
{
 int i,nrr=0;   
 
 citire();
  fin.close();

 for(i=1;i<=n;i++)
  if(!u[i])
   df1(i);
   
 memset(u,0,sizeof(u));
 
 for(i=n-1;i>=0;i--)
  if(!u[st[i]])
  {
   df21(st[i]);
   nrr++;
  }              
  
 fout<<nrr<<endl;
 
 memset(u,0,sizeof(u));
 
 for(i=n-1;i>=0;i--)
  if(!u[st[i]])
  {
   df20(st[i]);
   fout<<endl;
  }    
 
 //afis();
  fout.close();
return 0;
}

void citire()
{
 int i;
 int x,y;

 fin>>n>>m;

 for(i=1;i<=m;i++)
 {
  fin>>x;
  fin>>y;
  add(x,y,1);
  add(y,x,2);
 }
}

void add(int x,int y,int aux)
{
 lista *q;

 q=new lista;

 if(aux==1)
 {
  q->nod=y;
  q->urm=g[x];
  g[x]=q;
 }
 else
 {
  q->nod=y;
  q->urm=gt[x];
  gt[x]=q;   
 }
}

void df1(int nod)
{
 lista *p;

 u[nod]=1;
 
 for(p=g[nod];p!=NULL;p=p->urm)
  if(!u[p->nod])
   df1(p->nod);
 st[nst++]=nod;  
}

void df20(int nod)
{
 lista *p;

 u[nod]=1;
 fout<<nod<<" ";
 
 for(p=gt[nod];p!=NULL;p=p->urm)
  if(!u[p->nod])
   df20(p->nod);
}

void df21(int nod)
{
 lista *p;

 u[nod]=1;
 //fout<<nod<<" ";
 
 for(p=gt[nod];p!=NULL;p=p->urm)
  if(!u[p->nod])
   df21(p->nod);
}