Cod sursa(job #3300432)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 15 iunie 2025 18:06:30
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;
const int NMAX = 100002;

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

vector <vector <int>> v, ctc;
int f[NMAX]; ///0 - neaccesat, 1- accesat vechi, 2-e in stiva
int niv[NMAX], h[NMAX];
stack <int> s;
int timp = 0;

void dfs(int start) {
    //cout << "dfs " << start << "  " << niv[start] << " " << h[start] << '\n';
    f[start] = 2; ///IN STIVA
    s.push(start);
    for(auto nod : v[start]) {
        if(f[nod] == 2) { ///de intoarcere
            if(niv[nod] < niv[start]) ///de intoarcere
                h[start] = min(h[start], niv[nod]);
            continue;
        }
        if(f[nod] == 1) ///muchie transversala --> ignore
            continue;
        //cout << "ayoo " << nod << '\n';
        timp++;
        niv[nod] = timp;
        h[nod] = timp;
        dfs(nod);
        h[start] = min(h[start], h[nod]);
    }
    //cout << "final " << start << "  " << niv[start] << " " << h[start] << '\n';
    if(h[start] >= niv[start]) { ///ctc nou
        //cout << "CTC " << start << '\n';
        ctc.push_back(vector <int>());
        while(!s.empty() && s.top() != start) {
            ctc.back().push_back(s.top());
            f[s.top()] = 1;
            s.pop();
        }
        s.pop();
        ctc.back().push_back(start);
        f[start] = 1;
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    v.resize(n + 1);
    for(int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        v[a].push_back(b);
    }
    for(int i = 1; i <= n; i++) {
        if(!f[i]) {
            timp++;
            niv[i] = timp;
            h[i] = timp;
            dfs(i);
        }
    }
    cout << ctc.size() << '\n';
    for(int i = 0; i < ctc.size(); i++) {
        for(auto nod : ctc[i])
            cout << nod << " ";
        cout << '\n';
    }
    return 0;
}