Cod sursa(job #2506590)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 8 decembrie 2019 14:37:34
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include<fstream>
#include<algorithm>
#define nmax 100005
#define mmax 200008
using namespace std;
ifstream f ("ctc.in");
ofstream g ("ctc.out");
bool fr[nmax];
int n,i,j,m,star[nmax],t[3][mmax],k,coloana,rezultat,stiva[nmax],element,varf,vecin,ordine[nmax],cnt,componente;
int starinvers[nmax],tinvers[3][mmax],kinvers;
int a[2*nmax],poz=0;
int main()
{
  f>>n>>m;
  while(m)
  {
      m--;
      f>>i>>j;
      k++;
      t[0][k]=j;
      t[1][k]=star[i];
      star[i]=k;
      kinvers++;
      tinvers[0][kinvers]=i;
      tinvers[1][kinvers]=starinvers[j];
      starinvers[j]=kinvers;
  }
  for(i=1;i<=n;i++)
  {
      if(fr[i]==0)
      {
          stiva[++varf]=i;
          fr[i]=1;
          while(varf)
          {
          element=stiva[varf];
          coloana=star[element];
          int ok=0;
          while(coloana && ok==0)
          {
                vecin=t[0][coloana];
              if(fr[vecin]==0)
              {
                  stiva[++varf]=vecin,ok=1,fr[vecin]=1;
              }
              coloana=t[1][coloana];
          }
           if(ok==0)
               ordine[++cnt]=element,varf--;
          }
      }
  }
 for(i=n;i>=1;i--)
 {
    if(fr[ordine[i]]==1)
      {
          componente++;
          a[++poz]=-1;
          a[++poz]=ordine[i];
          varf=0;
          stiva[++varf]=ordine[i];
          fr[ordine[i]]=0;
          while(varf)
          {
          element=stiva[varf];
          coloana=starinvers[element];
          int ok=0;
          while(coloana && ok==0)
          {
                vecin=tinvers[0][coloana];
              if(fr[vecin]==1)
              {
                  stiva[++varf]=vecin,ok=1,fr[vecin]=0;
                   a[++poz]=vecin;
              }
              coloana=tinvers[1][coloana];
          }
           if(ok==0)
            varf--;
          }
      }
 }
 g<<componente;
j=1;
while(a[j])
 {
 if(a[j]!=-1)
    g<<a[j]<<" ";
 else
 g<<'\n';
   j++;
}
}