Cod sursa(job #2175216)

Utilizator andreizaicescuAndrei Zaicescu andreizaicescu Data 16 martie 2018 16:01:48
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>

using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
ifstream ff("ctc.in");
struct el{int nod; int urm;};
el a[200001];
int l[100001],v[100001],lung[100001],noduri[100001];
bool viz[100001];
int n,m,x,y,k,kk;
void add(int x, int y)
{
    k++;
    a[k].nod=y;
    a[k].urm=l[x];
    l[x]=k;
}

void parc(int x)
{
    viz[x]=1;
    int poz=l[x];
    while(poz)
    {
        if(viz[a[poz].nod]==0)
            parc(a[poz].nod);
        poz=a[poz].urm;
    }
    kk++;
    v[kk]=x;
}
void caut2(int x, int nr)
{
    viz[x]=1;
    int poz=l[x];
    while(poz)
    {
        if(viz[a[poz].nod]==0)
        {
            lung[nr]++;
            caut2(a[poz].nod,nr);
        }
        poz=a[poz].urm;
    }
    kk++;
    noduri[kk]=x;

}
int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        add(x,y);
    }
    for(i=1;i<=n;i++)
    {
        if(viz[i]==0)
        parc(i);
    }
    for(i=1;i<=n;i++)
        {viz[i]=0; l[i]=0;}
    k=0;
    ff>>x>>y;
    for(i=1;i<=m;i++)
    {
        ff>>x>>y;
        add(y,x);
    }
    int nr=0;
    kk=0;
    for(i=n;i>=1;i--)
    {
        if(viz[v[i]]==0)
        {
            nr++;
            caut2(v[i],nr);
        }
    }
    g<<nr<<'\n';
    int nr2=0;
    int j;
    for(i=1;i<=nr;i++)
    {
        for(j=1;j<=lung[i]+1;j++)
        {
            nr2++;
            g<<noduri[nr2]<<" ";
        }
        g<<'\n';
    }
    return 0;
}