Cod sursa(job #2541163)

Utilizator andaraluca2001Anda Epure andaraluca2001 Data 8 februarie 2020 10:32:31
Problema Componente tare conexe Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
using namespace std;
const int N=100009;
const int M = 200001;
int lst1[N],vf1[M],n,m,L,D,nr1,urm1[M],sorttop[N],ns,lst2[N],vf2[M],urm2[M],nr2,nrcomp,nrel[N];
bool viz[N],v[N];
ifstream in("ctc.in");
ofstream out("ctc.out");
void adauga1(int x, int y)
{
    vf1[++nr1]=y;
    urm1[nr1]=lst1[x];
    lst1[x]=nr1;

}

void adauga2(int x,int y)
{
    vf2[++nr2]=y;
    urm2[nr2]=lst2[x];
    lst2[x]=nr2;

}
void dfs(int x)
{
      viz[x]=true;
      int y;
      for(int p=lst1[x];p!=0;p=urm1[p])
      {
           y=vf1[p];
           if(!viz[y]) dfs(y);
      }
     sorttop[++ns]=x;
}

void dfs2(int x)
{
   v[x]=true;
   nrel[nrcomp]++;
   int y;
   for(int p=lst2[x];p!=0;p=urm2[p])
   {
       y=vf2[p];
       if(!v[y]) dfs2(y);

   }

}
int main()
{
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        in>>L>>D;
        adauga1(L,D);
        adauga2(D,L);
    }
    for(int i=1;i<=n;i++)
    {
        if(!viz[i]) dfs(i);
    }
   //for(int i=ns;i>=1;i--) out<<sorttop[i]<<" ";

   for(int i=ns;i>=1;i--)
   {
        if(!v[sorttop[i]])
        {
           nrcomp++;
           dfs2(sorttop[i]);

        }

   }


   out<<nrcomp<<"\n";
   int ind=1;

   while(nrcomp>0)
   {

       while(nrel[nrcomp]>0)
       {
         out<<sorttop[ind]<<" ";
         ind++;
         nrel[nrcomp]--;

       }

       out<<'\n';
     nrcomp--;

   }
    return 0;



}