Cod sursa(job #2107036)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 16 ianuarie 2018 18:22:23
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
#define NMAX 100005

using namespace std;

int n, m, viz[NMAX], vizt[NMAX], nrSol;
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 x, y;
        scanf("%d %d", &x, &y);
        g[x].push_back(y);
        gt[y].push_back(x); /// graf transpus
    }
}

void dfs(int node)
{
    viz[node] = 1;
    vector <int>::iterator it;
    for(it = g[node].begin(); it != g[node].end(); ++it)
        if(viz[*it] == 0)
        {
            dfs(*it);

        }
    s.push(node);
}

void dfsTrans(int node)
{
    vizt[node] = 1;
    sol[nrSol].push_back(node);
    vector <int>::iterator it;
    for(it = gt[node].begin(); it != gt[node].end(); ++it)
        if(vizt[*it] == 0)
        {
            dfsTrans(*it);
        }
}

void solve()
{
    for(int i=1; i<=n; ++i)
        if(viz[i] == 0)
            dfs(i);
    while(!s.empty())
    {
        int x = s.top();
        if(vizt[x] == 0)
        {
            dfsTrans(x);
            nrSol++;
        }
        s.pop();
    }
}

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