Cod sursa(job #771798)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 27 iulie 2012 01:43:50
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
using namespace std;

int n,m,i,j;
struct lista
{int nod;
 lista* next;};
lista* a[100001];
lista* b[100001];

void addplus(int x, int y)
{lista* q = new lista;
 q->nod=y;
 q->next=a[x];
 a[x]=q;}
 
void addminus(int x, int y)
{lista* q = new lista;
 q->nod=y;
 q->next=b[x];
 b[x]=q;} 

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

int vizplus[100001], vizminus[100001], nrconex,lung[100001],stack[100001],nstack,poz;

void depthplus(int e)
{lista* q=a[e];
while(q)
   {if(vizplus[q->nod]==0 || (vizplus[q->nod]!=vizminus[q->nod] && vizplus[q->nod]!=nrconex))
       {vizplus[q->nod]=nrconex;
       depthplus(q->nod);}
    q=q->next;}
}

void depthminus(int e)
{lista* q=b[e];
while(q)
   {if(vizminus[q->nod]==0 && vizplus[q->nod]==nrconex)
       {lung[nrconex]++;
       nstack++;
       stack[nstack]=q->nod;
       poz=nstack;
       while(poz>=nstack-lung[nrconex]+1 && q->nod<stack[poz-1])
          {stack[poz]=stack[poz-1];
          stack[poz-1]=q->nod;
          poz--;}
     
       vizminus[q->nod]=nrconex;
       depthminus(q->nod);} 
    q=q->next;}
}

int main()
{f>>n>>m;
int x,y;
for( i=1; i<=m; i++)
  {f>>x>>y;
  addplus(x,y);
  addminus(y,x);}

for(i=1; i<=n; i++)
    {if(vizminus[i]==0 || vizplus[i]!=vizminus[i])
     {nrconex++; 
      lung[nrconex]=1;
      vizplus[i]=nrconex; 
      vizminus[i]=nrconex;
      nstack++;
      stack[nstack]=i;
      depthplus(i); 
      depthminus(i);}    
      }

g<<nrconex<<endl;
//g<<lung[1]<<" ";
int count=1;  
int length=lung[1];
for(i=1; i<=n; i++)
{if(i==length+1)
   {g<<endl;
   count++;
   //g<<lung[count]<<" ";
   length+=lung[count];}
   g<<stack[i]<<" ";
}   
f.close();
g.close();
return 0;}