Cod sursa(job #2125514)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 8 februarie 2018 15:29:10
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
#define NMAX 100005

using namespace std;

int N, M, nrSol;
bool viz[NMAX], vizT[NMAX];
vector <int> G[NMAX], GT[NMAX], sol[NMAX];
stack <int> S;

void read()
{
    scanf("%d %d", &N, &M);
    for(int i=1; i<=M; ++i)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        G[a].push_back(b);
        GT[b].push_back(a);
    }
}

void dfs(int node)
{
    viz[node] = true;
    vector <int>::iterator it;
    for(it = G[node].begin(); it != G[node].end(); ++it)
        if(viz[*it] == false)
            dfs(*it);
    S.push(node);
}

void dfsTranspus(int node)
{
    vizT[node] = true;
    sol[nrSol].push_back(node);
    vector <int>::iterator it;
    for(it = GT[node].begin(); it != GT[node].end(); ++it)
        if(vizT[*it] == false)
            dfsTranspus(*it);
}

void solve()
{
    for(int i=1; i<=N; ++i)
        if(viz[i] == false)
            dfs(i);
    while(!S.empty())
    {
        int node = S.top();
        S.pop();
        if(vizT[node] == false)
        {
            dfsTranspus(node);
            nrSol++;
        }
    }
}

void print()
{
    printf("%d\n", nrSol);
    for(int i=0; i<nrSol; ++i)
    {
        sort(sol[i].begin(), sol[i].end());
        vector <int>::iterator it;
        for(it = sol[i].begin(); it != sol[i].end(); ++it)
            printf("%d ", *it);
        printf("\n");
    }
}

int main()
{
    freopen("ctc.in", "r", stdin);
    freopen("ctc.out", "w", stdout);
    read();
    solve();
    print();
    return 0;
}