Cod sursa(job #757452)

Utilizator deneoAdrian Craciun deneo Data 12 iunie 2012 08:52:38
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
using namespace std;

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

#define MAXN 100100

vector<int> Gi[MAXN], Go[MAXN], stiva, rez[MAXN];
int n, m, used[MAXN], comp[MAXN];

void DF1(int nod) {
    used[nod] = 1;
    for (int i = 0; i < Gi[nod].size(); ++i) {
        if (!used[Gi[nod][i]])
            DF1(Gi[nod][i]);
    }
    stiva.push_back(nod);
}
void DF2(int nod, int v) {
    comp[nod] = v;
    for (int i = 0; i < Go[nod].size(); ++i) {
        if (comp[Go[nod][i]] == 0)
            DF2(Go[nod][i], v);
    }
}

int main() {
    int i, cnt = 0, j, x, y;
    fin >> n >> m;
    for (i = 1; i <= m; ++i) {
        fin >> x >> y;
        Gi[x].push_back(y);
        Go[y].push_back(x);
    }
    for (i = 1; i <= n; ++i)
        if (!used[i])
            DF1(i);

    for (; stiva.size(); stiva.pop_back())
        if (comp[stiva.back()] == 0)
            DF2(stiva.back(), ++cnt);

    for (i = 1; i <= n; ++i)
        rez[comp[i]].push_back(i);

    fout << cnt << "\n";
    for (i = 1; i <= cnt; ++i) {
        for (j = 0; j < rez[i].size(); ++j)
            fout << rez[i][j] << " ";
        fout << "\n";
    }
    return 0;
}