Cod sursa(job #2870719)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 12 martie 2022 15:22:37
Problema Componente tare conexe Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 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] ;

void dfs(int nod, int k)
{
    if(viz[nod])return ;

    viz[nod] = k ;

    for(int f = 0 ; f < m[nod].size() ; f ++)
        dfs(m[nod][f], k) ;
}

vector<vector<int> > rez ;

void dfs2(int nod, int k)
{
    if(viz[nod] != k)return ;

    viz[nod] *= -1 ;

    rez.back().push_back(nod) ;

    for(int f = 0 ; f < rev[nod].size() ; f ++)
        dfs2(rev[nod][f], viz[nod] * -1) ;
}

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) ;
    }

    int k = 0 ;

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

    for(int f = 1 ; f <= n ; f ++)
        if(viz[f] > 0)
        {
            vector<int> aux ;

            rez.push_back(aux) ;

            dfs2(f, viz[f]) ;
        }

    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