Cod sursa(job #856827)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 16 ianuarie 2013 23:27:10
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
#define minim(a,b) ((a) < (b) ? (a) : (b))
#define NMAX 100010
using namespace std;

ifstream in("ctc.in");
ofstream out("ctc.out");

vector <int> vecini[NMAX];
stack <int> s;
vector <int>sol[NMAX];
int index[NMAX],viz[NMAX],lowlink[NMAX],n,m,nr=0,ind=0;

void citire()
{
 in>>n>>m;
 for (int i=1;i<=m;i++)
 {
  int x,y;
  in>>x>>y;
  vecini[x].push_back(y);
 }
}
 
void tarjan(const int nod,const vector<int>* vecini)
{
 int i;
 index[nod]=ind;
 lowlink[nod]=ind;
 ind++;
 viz[nod]=1;
 s.push(nod);
 for(i=0;i<vecini[nod].size();i++)
 {
  if (index[vecini[nod][i]]== -1)
  {
   tarjan(vecini[nod][i],vecini);
 
   lowlink[nod]=minim(lowlink[nod],lowlink[vecini[nod][i]]);
  }
  else
  {
   if (viz[vecini[nod][i]]==1)
   {
    lowlink[nod]=minim(lowlink[nod],lowlink[vecini[nod][i]]);
   }
  }
 }
 if (lowlink[nod]==index[nod])
 {
  nr++;
  int nod1;
  do{
    nod1=s.top();
   sol[nr].push_back(nod1);
   s.pop();
   viz[nod1]=0;
  }
  
  while (nod1!=nod);
  cout<<nr<<'\n';
  for (int j=0;j<sol[nr].size();j++)
   cout<<sol[nr][i]<<' ';
  cout<<'\n';
 }
}
void init()
{
 for (int i=1;i<=n;i++)
 {
  viz[i]=0;
  index[i]=-1;
  lowlink[i]=0;
 }
}
   
int main()
{
 citire();
 init();
 
 for (int i=1;i<=n;i++)
 {
  if (index[i]==-1)
  {
   cout<<i<<' ';
   tarjan(i,vecini);
  }
 }
 out<<nr<<'\n';
 for (int i=1;i<=nr;i++)
 {
  for (int j=0;j<sol[i].size();j++)
  out<<sol[i][j]<<' ';
  out<<'\n';
 }
 return 0;
}