Cod sursa(job #1249753)

Utilizator stefan1Medvichi Stefan stefan1 Data 27 octombrie 2014 13:36:19
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#define DMAX 100002
#define NMAX 1002

using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");

int n, m;
int L1[DMAX][NMAX], L2[DMAX][NMAX], sol[DMAX][NMAX];
int M1[DMAX], M2[DMAX];
bool uz1[DMAX], uz2[DMAX], fol[DMAX];
int nr;

void citire();
void comp_tare_conexe();
void DFS1(int);
void DFS2(int);
void init();
void afisare();

int main()
{
citire();
comp_tare_conexe();
afisare();
return 0;
}

void comp_tare_conexe()
{
int i, j, k;
for (i=1; i<=n; i++)
    if (!fol[i])
        {
            init();
            M1[0]=M2[0]=1;
            M1[1]=i;
            DFS1(i);
            M2[1]=i;
            DFS2(i);
            // intersectia
            for (j=1; j<=M1[0]; j++)
                for (k=1; k<=M2[0]; k++)
                    if (M1[j]==M2[k])
                        {sol[nr][++sol[nr][0]]=M1[j]; fol[M1[j]]=1;}
            nr++;
        }
}

void DFS1(int vf)
{
int i;
uz1[vf]=1;
for (i=1; i<=L1[vf][0]; i++)
    if (!uz1[L1[vf][i]])
        {
            M1[++M1[0]]=L1[vf][i];
            DFS1(L1[vf][i]);
        }
}

void DFS2(int vf)
{
int i;
uz2[vf]=1;
for (i=1; i<=L2[vf][0]; i++)
    if (!uz2[L2[vf][i]])
        {
            M2[++M2[0]]=L2[vf][i];
            DFS2(L2[vf][i]);
        }
}

void init()
{
int i;
for (i=1; i<=n; i++)
    uz1[i]=uz2[i]=0;
}

void afisare()
{
int i, j;
fout<<nr<<'\n';
for (i=0; i<nr; i++)
    {for (j=1; j<=sol[i][0]; j++)
        fout<<sol[i][j]<<' ';
     fout<<'\n';
    }
fout.close();
}

void citire()
{
int i, x, y;

fin>>n>>m;
for (i=1; i<=m; i++)
    {
        fin>>x>>y;
        L1[x][++L1[x][0]]=y;
        L2[y][++L2[y][0]]=x;
    }
}