Cod sursa(job #2354498)

Utilizator CojocaruCristianCojocaru Cristian CojocaruCristian Data 25 februarie 2019 12:43:08
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#define MAX 100002

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

void citire();
void DFS(int x);
void DFST(int x);
void afisare();
vector <int> G[MAX];
vector <int> CTC[MAX];
vector <int> GT[MAX];

bool uz[MAX];
int ctc[MAX];
///ctc[i]= componenta tare conexa din care face parte y
int postordine[MAX];
int n, m, c,nr,nrc;

int main()
{int i;
    citire();
    ///etapa 1
    for(i=1;i<=n;i++)
        if(!uz[i])
            DFS(i);
    ///etapa 2
    for(i=n;i>0;i--)
        if(!ctc[postordine[i]])
        {   nrc++;
            DFST(postordine[i]);
        }
    afisare();
}

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

    fin >> n >> m;
    for(i=0;i<m;i++)
    {
        fin >> x >> y;
        G[x].push_back(y);
        ///in graful transpus, pun arcul (y,x)
        GT[y].push_back(x);

    }
}

void DFS(int x)
{   int i;
    uz[x] = 1;
    for(i=0;i<G[x].size();i++)
        if(uz[G[x][i]]==0)    DFS(G[x][i]);
    nr++;
    postordine[nr]=x;
}
void DFST(int x)
{   int i;
    ctc[x] = nrc;
    CTC[nrc].push_back(x);
    for(i=0;i<GT[x].size();i++)
        if(ctc[GT[x][i]]==0)    DFST(GT[x][i]);
}

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