Cod sursa(job #2864243)

Utilizator toda.emanuelatoda emanuela toda.emanuela Data 7 martie 2022 18:35:01
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int t[2][200001],start[100001],t1[1][200001],start1[100001],n,m;
int stiva[100001],z;
int viz[100001],nrcmp;

void citire()
{
    int i,k=0,x,y;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        k++;
        t[0][k]=y;
        t[1][k]=start[x];
        start[x]=k;
        t1[0][k]=x;
        t1[1][k]=start1[y];
        start1[y]=k;
    }
}

void df(int nod)
{
    int p;
    viz[nod]=1;
    p=start[nod];
    while(p)
    {
        if(viz[t[0][p]]==0) df(t[0][p]);
        p=t[1][p];
    }
    stiva[++z]=nod;
}

void df_inapoi(int nod)
{
    int p;
    viz[nod]=nrcmp;
    p=start1[nod];
    while(p)
    {
        if(viz[t1[0][p]]==0)
            df_inapoi(t1[0][p]);

        p=t1[1][p];
    }
}
int contor=0;
void afisare(int cod,int i)
{
    if(i>=1)
    {
        if(viz[i]==cod) contor++;
        afisare(cod,i-1);
        if(viz[i]==cod)
        {
            g<<i<<" ";
            viz[i]=0;
        }

    }
    else g<<contor<<" ";
}
int main()
{
    citire();
    int i;
    for(i=1;i<=n;i++)
        if(viz[i]==0)
           df(i);

    for(i=1;i<=n;i++)
        viz[i]=0;

    nrcmp=0;
    while(z)
    {
        if(viz[stiva[z]]==0)
        {
            nrcmp++;
            df_inapoi(stiva[z]);
        }
        z--;
    }

    g<<nrcmp<<'\n';
    for(i=1;i<=n;i++)
    {
        if(viz[i])
        {
             contor=0;
            afisare(viz[i],n);
            g<<'\n';
        }

    }
    return 0;
}