Cod sursa(job #2675878)

Utilizator LittleGreenMenMihai A LittleGreenMen Data 22 noiembrie 2020 18:52:57
Problema Componente tare conexe Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define MAX_N 100005

using namespace std;

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

int N, M;
vector<int> adiac[MAX_N];
vector<int> inv_adiac[MAX_N];
vector<int> parcurgere, trans;
bool vizitat[MAX_N];

void DFS(vector<int> m[], int nod)
{
    int i;

    vizitat[nod] = !vizitat[nod];
    parcurgere.push_back(nod);

    for(i = 0; i < m[nod].size(); i++)
        if(vizitat[m[nod][i]] != vizitat[nod])
            DFS(m, m[nod][i]);
}

void afis(vector<int> to_afis)
{
    for(int e : to_afis)
        out << e << ' ';
    out << '\n';
}

int main()
{
    int x, y, i;
    vector< vector<int> > rezultat;

    in >> N >> M;
    for(i = 0; i < M; i++) {
        in >> x >> y;

        adiac[x].push_back(y);
        inv_adiac[y].push_back(x);
    }

    for(i = 1; i <= N; i++)
        if(!vizitat[i])
            DFS(inv_adiac, i);

    reverse(parcurgere.begin(), parcurgere.end()); trans = parcurgere;
    for(i = 0; i < trans.size(); i++) {
        if(vizitat[trans[i]]) {
            parcurgere.clear();
            DFS(adiac, trans[i]);
            rezultat.push_back(parcurgere);
        }
    }

    out << rezultat.size() << '\n';
    for(auto vec : rezultat)
        afis(vec);

    in.close();
    out.close();

    return 0;
}