Cod sursa(job #1782138)

Utilizator gamanedyGaman Eduard-Marian gamanedy Data 17 octombrie 2016 20:17:32
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m,viz[100002],vizp[100002],vizm[100002];
struct nod
{
    int v;
    nod *urm;
};
nod *Lp[100002], *Lm[100002], *C[100002],*p;
int z[100002],k;
void fillp(int x, int r)
{
    vizp[x]=r;
    for(nod *p=Lp[x];p!=0;p=p->urm)
    {
        int y=p->v;
        if(vizp[y]!=r)
        {
            fillp(y,r);
        }
    }
}
void fillm(int x,int r)
{
    vizm[x]=r;
    for(nod *p=Lm[x];p!=0;p=p->urm)
    {
        int y=p->v;
        if(vizm[y]!=r)
        {
            fillm(y,r);
        }
    }
}
int i,j,x,y,c;

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        p=new nod;
        p->v=y;
        p->urm=Lp[x];
        Lp[x]=p;
        p=new nod;
        p->v=x;
        p->urm=Lm[y];
        Lm[y]=p;
    }
    k=0;
    for(i=1;i<=n;i++)
    {
        if(viz[i]==0)
        {
            k++;
            fillp(i,k);
            fillm(i,k);
            for(j=n;j>=1;j--)
            {
                if(vizm[j]==k && vizp[j]==k)
                {
                    viz[j]=k;
                    p=new nod;
                    p->v=j;
                    p->urm=C[k];
                    C[k]=p;
                }
            }
        }
    }
    fout<<k<<'\n';
    for(i=1;i<=k;i++)
    {
        for(p=C[i];p!=0;p=p->urm)
        {
            x=p->v;
            fout<<x<<" ";
        }
        fout<<'\n';
    }
    return 0;
}