Cod sursa(job #627156)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 29 octombrie 2011 10:25:02
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.74 kb
#include <fstream>
#include <set>

using namespace std;

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

struct nod
{
    int nr;
    nod *next;
} *v[5005],*p,*vt[5005],*comp[5005];

set <int> pluss;
//set <int> :: iterator it,o;

int n,m,a,b,minim,k;
char prez[5005];

void DFSp(int);
void DFSm(int);

int main()
{
    int i;
    f>>n>>m;
    minim=1;
    for(i=1;i<=m;++i)
    {
        f>>a>>b;
        //adaug vecinul b la lista lui a in G
        p=new nod;
        p->nr=b;
        p->next=v[a];
        v[a]=p;
        //adaug vecinul a la lista lui b in G(t)
        p=new nod;
        p->nr=a;
        p->next=vt[b];
        vt[b]=p;
    }
    //afisare de control
    /*for(i=1;i<=n;++i)
    {
        p=v[i];
        g<<'\n'<<i<<": ";
        while(p)
        {
            g<<p->nr<<' ';
            p=p->next;
        }
    }
    //g.flush();
    g<<"\n\n";*/
    //afisarea multimilor DFSp, DFSm
    while(minim<=n)
    {
        ++k;
        prez[minim]='1';
        pluss.clear();
        pluss.insert(minim);
        g<<minim<<' ';
        /*p=new nod;
        p->nr=minim;
        p->next=comp[k];
        comp[k]=p;*/
        DFSp(minim);
        g.flush();
        pluss.erase(minim);
        DFSm(minim);
        while(prez[minim]) ++minim;
    }
    g<<k<<'\n';
    for(i=1;i<=k;++i)
    {
        p=comp[i];
        while(p)
        {
            g<<p->nr<<' ';
            p=p->next;
        }
        g<<'\n';
    }
    f.close(); g.close();
    return 0;
}

void DFSp(int x)
{
    nod *q=v[x];
    while(q)
    {
        //daca am un vecin vizitat ma duc la urmatorul
        if(!prez[q->nr] && pluss.find(q->nr)==pluss.end()){pluss.insert(q->nr);DFSp(q->nr);}

        q=q->next;

    }
}

void DFSm(int x)
{
    nod *q=vt[x];
    while(q)
    {
        //daca am un vecin vizitat ma duc la urmatorul
        /*if(prez[q->nr])
        {
            q=q->next;
            continue;
        }
        if(pluss.find(q->nr)!=pluss.end())
        {
            g<<q->nr<<' ';
            /*p=new nod;
            p->nr=q->nr;
            p->next=comp[k];
            comp[k]=p;
            prez[q->nr]='1';
            pluss.erase(q->nr);
            g.flush();
        }
        DFSm(q->nr);
        q=q->next;*/

        if(!prez[q->nr])
        { if(pluss.find(q->nr)!=pluss.end())g<<q->nr<<' ',prez[q->nr]='1';
          g.flush();
           DFSm(q->nr);
        }
            q=q->next;


            /*p=new nod;
            p->nr=q->nr;
            p->next=comp[k];
            comp[k]=p;
            prez[q->nr]='1';
            pluss.erase(q->nr);
            g.flush();
        }
        DFSm(q->nr);
        q=q->next;*/
    }
}