Cod sursa(job #2870750)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 12 martie 2022 15:40:35
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <deque>
#include <algorithm>
#include <climits>
#include <iomanip>
#include <cmath>

#define MOD 666013
#define INT_MAX 1000000000

using namespace std ;

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

int n, viz[100009] ;

vector<int> m[100009], rev[100009] ;

deque<int> dq ;

void dfs1(int nod)
{
    if(viz[nod])return ;

    viz[nod] = 1 ;

    for(int f = 0 ; f < m[nod].size() ; f ++)
        dfs1(m[nod][f]) ;

    dq.push_back(nod) ;
}

vector<vector<int> > rez ;

void dfs2(int nod)
{
    if(viz[nod]) return ;

    viz[nod] = 1 ;

    rez.back().push_back(nod) ;

    for(int f = 0 ; f < rev[nod].size() ; f ++)
        dfs2(rev[nod][f]) ;
}

int main()
{
    int q ;

    cin >> n >> q ;

    while(q --)
    {
        int a, b ;

        cin >> a >> b ;

        m[a].push_back(b) ;
        rev[b].push_back(a) ;
    }

    /// pasul 1, creearea dqului

    for(int f = 1 ; f <= n ; f ++)
        if(!viz[f])
            dfs1(f) ;

    for(int f = 1 ; f <= n ; f ++)
        viz[f] = 0 ;

    while(dq.size())
    {
        int nod = dq.back() ;

        if(viz[nod])dq.pop_back() ;
        else
        {
            vector<int> aux ;

            rez.push_back(aux) ;

            dfs2(nod) ;
        }
    }

    cout << rez.size() << endl ;

    for(int f = 0 ; f < rez.size() ; f ++)
    {
        for(int e = 0 ; e < rez[f].size() ; e ++)
            cout << rez[f][e] << " " ;

        cout << '\n' ;
    }

    return 0 ;
}
/// 1990