Cod sursa(job #442836)

Utilizator liviu12345Stoica Liviu liviu12345 Data 15 aprilie 2010 15:23:08
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream.h>
#include<vector>


#define maxn 201010
using namespace std;
struct timpi 
{
  int intrare;
  int iesire;
};

int sel[maxn],n,m;
vector< int > listadirect[maxn];
vector< int > listainvers[maxn];
int k,iesiri[maxn];
timpi A[maxn];

ofstream g ("ctc.out");
void DF (int i)
{
  int j;
  sel[i]=1;
  A[i].intrare=k++;
  for (j=0;j<listadirect[i].size();j++)
  {
    if (sel[listadirect[i][j]]==0)
    {
      DF(listadirect[i][j]);
      k++;
    }
  }
  A[i].iesire=k;
  iesiri[++m]=i;
}
void DF2(int i)
{
  int j;
  sel[i]=0;
  for (j=0;j<listainvers[i].size();j++)
  {
    if(sel[listainvers[i][j]]==1)
    //    if (A[i].iesire>A[listainvers[i][j]].intrare)
			DF2(listainvers[i][j]);
      
    
  }
  g<<i<<" ";
}
void DF3(int i)
{
  int j;
  sel[i]=0;
  for (j=0;j<listainvers[i].size();j++)
  	if(sel[listainvers[i][j]]==1)
	  //  if (A[i].iesire>A[listainvers[i][j]].intrare)
      		DF3(listainvers[i][j]);
      

}
int main ()
{
  int i, j,h=0;
  ifstream f ("ctc.in");

  f>>n>>h;

 for( int i = 1; i <= h; ++i)
  {
	f>>i>>j;
    listadirect[i].push_back( j );
    listainvers[j].push_back( i );
  }
  for (i=1;i<=n;i++)
  {
    if (sel[i]==0)
    {
      DF(i);
      k++;
    }
  }
  h = 0;
  for(i=m;i>=1;i--)
  {
    if (sel[iesiri[i]]==1)
    {
     
      DF3(iesiri[i]);
      h++;
    }
  }
  g<<h<<endl;
 
  for (i=1;i<=n;i++)
    sel[i]=1;
  
  for(i=m;i>=1;i--)
  {
    if (sel[iesiri[i]]==1)
    {
     
      DF2(iesiri[i]);
      g<<endl;
    }
  }
  
  f.close();
  g.close();
  return 0;
}