Cod sursa(job #3277989)

Utilizator Codrut_NeagNeag Codrut Serban Codrut_Neag Data 18 februarie 2025 13:29:29
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <fstream>

using namespace std;

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

int n, m, t[2][400010], start[400010], st[100100], varf, id[100100], d[110000], nr, conex, ans[200100], a;
bool viz[110000], fr[100100];

void citire()
{
    int x;
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        in>>x>>t[0][i];
        t[1][i]=start[x];
        start[x]=i;
    }
}

void adaugare(int x, int y)
{
    conex++;
    for(int i=x; i>=y; i--)
    {
        ans[++a]=st[i];
        fr[st[i]]=0;
    }
    varf=y-1;
    ans[++a]=-1;
}

void determina_componenta(int k)
{
    int x=st[k], y;
    k--;
    y=st[k];
    while(k)
    {
        y=st[k];
        d[y]=min(d[x],d[y]);
        if(id[y]==d[y]&&start[y]==0)
        {
            adaugare(varf,y);
            return;
        }
        x=st[k];
        k--;
    }
}

 void Tarjan()
 {
     for(int i=1; i<=n; i++)
     {
         if(viz[i]==0)
         {
             viz[i]=1;
             fr[i]=1;
             st[++varf]=i;
             int x=st[varf];
             id[x]=d[x]=++nr;
             while(varf)
             {
                 int man=start[x];
                 while(man)
                 {
                     if(viz[t[0][man]]==0)
                     {
                         viz[t[0][man]]=1;
                         st[++varf]=t[0][man];
                         start[x]=t[1][man];
                         fr[t[0][man]]=1;
                         id[t[0][man]]=d[t[0][man]]=++nr;
                         break;
                     }
                     else
                     {
                         if(fr[t[0][man]])
                             d[x]=min(d[x],d[t[0][man]]);
                     }
                     if(start[t[0][man]]==0)
                     {
                         determina_componenta(varf);
                     }
                     man=t[1][man];
                 }
                 x=st[varf];
             }
         }
     }
 }

 void afisare()
 {
     out<<conex<<'\n';
     int j=1;
     for(int i=1; i<=conex; i++)
     {
         while(ans[j]!=-1)
            out<<ans[j++]<<" ";
         j++;
         out<<'\n';
     }
 }

int main()
{
    citire();
    Tarjan();
    afisare();
    return 0;
}