Cod sursa(job #1916237)

Utilizator andreizaicescuAndrei Zaicescu andreizaicescu Data 9 martie 2017 08:43:14
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <fstream>

using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
struct el{int nod; int urm;};
el a[200001];
int l[100001],n,k,i,j,v1[100001],v2[100001],x,y,m,nr;
bool viz[100001];
void ad(int x, int y)
{
    k++;
    a[k].nod=y;
    a[k].urm=l[x];
    l[x]=k;
}
void curat()
{
    int i;
    for(i=1;i<=n;i++)
        viz[i]=0;
}
void parc1(int nd)
{
    int i=1,ok;
    viz[nd]=1;
    v1[nd]=1;
    while(i)
    {
        ok=0;
        int poz=l[v1[i]];
        while(poz)
        {
            if(viz[a[poz].nod]==0)
            {
                ok=1;
                viz[a[poz].nod]=1;
                i++;
                v1[i]=a[poz].nod;
                poz=0;
            }
            poz=a[poz].urm;
        }
        if(ok==0)
        {
            x++;
            v2[x]=v1[i];
            i--;
        }
    }
}
void parc2(int nd)
{
    viz[nd]=1;
    v1[1]=nd;
    int i=1,ok;
    while(i)
    {
        ok=0;
        int poz=l[v1[i]];
        while(poz)
        {
            if(viz[a[poz].nod]==0)
            {
                ok=1;
                viz[a[poz].nod]=1;
                i++;
                v1[i]=a[poz].nod;
                poz=0;
            }
            poz=a[poz].urm;
        }
        if(ok==0)
            i--;
    }
}
void parc3(int nd)
{
    viz[nd]=1;
    v1[1]=nd;
    int i=1,ok;
    while(i)
    {
        ok=0;
        int poz=l[v1[i]];
        while(poz)
        {
            if(viz[a[poz].nod]==0)
            {
                ok=1;
                viz[a[poz].nod]=1;
                i++;
                v1[i]=a[poz].nod;
                poz=0;
            }
            poz=a[poz].urm;
        }
        if(ok==0)
            {
            g<<v1[i]<<" "; i--;}
    }
    g<<'\n';
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        ad(x,y);
    }
    x=0;
    parc1(1);
    //f.close();
    ifstream ff("ctc.in");
    ff>>n>>m;
    k=0;
    for(i=1;i<=n;i++)
        l[i]=0;
    for(i=1;i<=m;i++)
    {
        ff>>x>>y;
        ad(y,x);
    }

    curat();
    for(i=n;i>=1;i--)
        if(viz[v2[i]]==0)
    {   nr++;
        parc2(v2[i]);}
    g<<nr<<'\n';
    curat();
    for(i=m;i>=1;i--)
        if(viz[v2[i]]==0)
    {   nr++;
        parc3(v2[i]);}
    return 0;
}