Cod sursa(job #964507)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 21 iunie 2013 11:23:46
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
/// plus-minus
///  1.0
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>

using namespace std;

ifstream cin("ctc.in");
ofstream cout("ctc.out");

const int N = 100005;

vector <int> G[N] , nodes, Gt[N], adj(N), sol[N];
vector <short> used(N);

int n, m, ccount;

void read()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ; ++ i)
    {
        int x, y;
        cin >> x >> y;
        G[x].push_back(y);
        Gt[y].push_back(x);
    }
}
void dfp(int node) /// marcheaza cu plus
{
    used[node] = 1;
    for(vector<int> ::iterator it = G[node].begin(); it != G[node].end(); ++ it)
        if(!used[*it])
            dfp(*it);
    adj.push_back(node);
}
void dfm(int node)
{
    used[node] = 2;
    for(vector<int> :: iterator it = Gt[node].begin(); it != Gt[node].end(); ++ it)
        if(used[*it] == 1)
            dfm(*it);
    sol[ccount].push_back(node);
}
void plus_minus()
{
    for(int i = 1 ; i <= n ; ++ i)
        nodes.push_back(i);
    random_shuffle(nodes.begin(), nodes.end());
    for(int i = 0 ; i < n ; ++ i)
        if(!used[ nodes[i] ])
        {
            adj.clear();
            dfp(nodes[i]);
            ++ccount;
            dfm(nodes[i]);

            for(vector <int> :: iterator it = adj.begin(); it != adj.end(); ++ it)
                if(used[*it] == 1)
                    used[*it] = 0;
        }
}
void write()
{
    cout << ccount << "\n";
    for(int i = 1 ; i <= ccount; ++ i)
        {for(vector <int> :: iterator it = sol[i].begin(); it != sol[i].end(); ++ it)
            cout << *it << " " ;
        cout << "\n";}

}
int main()
{
    read();
    plus_minus();
    write();
    return 0;
}