Cod sursa(job #230425)

Utilizator MariusMarius Stroe Marius Data 13 decembrie 2008 21:57:13
Problema Componente tare conexe Scor Ascuns
Compilator cpp Status done
Runda Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const char iname[] = "ctc.in";
const char oname[] = "ctc.out";

#define MAXN  100005

vector <int> Go[MAXN], Gi[MAXN], G[MAXN];

void read_in(vector <int>* Go, vector <int>* Gi, int& n, const char iname[])
{
    ifstream in(iname);
    int cnt_edges, x, y;

    in >> n;
    for (in >> cnt_edges; cnt_edges > 0; -- cnt_edges) {
        in >> x >> y;
        x --, y --;
        Go[x].push_back(y);
        Gi[y].push_back(x);
    }
    in.close();
}

vector <int> used;

void DFP(const int n, vector <int>* G, vector <int>& adj)  // Marcheaza cu +
{
    vector <int>::iterator it;
    used[n] = 1;
    for (it = G[n].begin(); it != G[n].end(); ++ it)
        if (used[*it] == 0)
            DFP(*it, G, adj);
    adj.push_back(n);
}

void DFM(const int n, vector <int>* G, vector <int>& adj)  // Marcheaza cu -
{
    vector <int>::iterator it;
    used[n] = 2;
    for (it = G[n].begin(); it != G[n].end(); ++ it)
        if (used[*it] == 1)
            DFM(*it, G, adj);
    adj.push_back(n);
}

void print_out(const vector <int>* G, const int n, const char oname[])
{
    ofstream out(oname);
    vector <int>::const_iterator it;

    out << n <<'\n';
    for (int i = 0; i < n; ++ i) {
        for (it = G[i].begin(); it != G[i].end(); ++ it)
            out << *it + 1 << " ";
        out << '\n';
    }
    out.close();
}

int main(void)
{
    int n;
    vector <int> adj, nodes;
    vector <int>::iterator it;

    read_in(Go, Gi, n, iname);

    for (int i = 0; i < n; ++ i)  nodes.push_back(i);
    random_shuffle(nodes.begin(), nodes.end());
    used.resize(n);
    used.assign(used.size(), 0);
    int count = 0;
    for (int i = 0; i < n; ++ i) if (used[ nodes[i] ] == 0) {
        adj.clear();
        DFP(nodes[i], Go, adj);
        DFM(nodes[i], Gi, G[count]), count ++;

        for (it = adj.begin(); it != adj.end(); ++ it)
            if (used[*it] == 1)
                used[*it] = 0;
    }

    print_out(G, count, oname);

    return 0;
}