Cod sursa(job #937832)

Utilizator TripluYOlteanu Costin TripluY Data 11 aprilie 2013 09:16:37
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

#define N_MAX 100000
vector <int> graf[N_MAX];
vector <int> graf_transpus[N_MAX];

vector <int> ctc[N_MAX];
stack <int> stiva;

bool selectat[N_MAX];
int numar_ctc;

void df(int nod)
{
    selectat[nod] = true;
    for (unsigned int i=0;i<graf[nod].size();i++)
        if (selectat[graf[nod][i]] == false)
            df(graf[nod][i]);

    stiva.push(nod);
}

void df_transpus(int nod)
{
    selectat[nod] = true;
    ctc[numar_ctc].push_back(nod);

    for (unsigned int i=0;i<graf_transpus[nod].size();i++)
        if (selectat[graf_transpus[nod][i]] == false)
            df_transpus(graf_transpus[nod][i]);
}

int main()
{
    numar_ctc = 0;
    int n,m,i;

    ifstream f("ctc.in");
    f >> n >> m;
    for (i=0;i<m;i++)
    {
        int x,y;
        f >> x >> y;
        --x;
        --y;
        graf[x].push_back(y);
        graf_transpus[y].push_back(x);
    }
    f.close();

    for(i=0;i<n;++i)
        selectat[i] = false;

    for (i=0;i<n;++i)
        if (selectat[i] == false)
            df(i);


    for(i=0;i<n;++i)
        selectat[i] = false;

    while (!stiva.empty())
    {
        int nod = stiva.top();
        stiva.pop();
        if (selectat[nod] == false)
        {
            df_transpus(nod);
            ++numar_ctc;
        }
    }

    ofstream g("ctc.out");
    g << numar_ctc;
    unsigned int j;
    for (i=0;i<numar_ctc;i++)
    {
        g << endl;
        for (j=0;j<ctc[i].size();j++)
            g << ctc[i][j]+1 << " ";
    }
    g.close();
    return 0;
}