Cod sursa(job #2973404)

Utilizator LucaT2Tasadan Luca LucaT2 Data 31 ianuarie 2023 21:48:59
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N=100001;
int n,m,cnt,dfn[N],low[N],nr;
bool ins[N];
vector<int> adj[N],stk,con;
vector<vector<int>>sol;


void tarjan(int u) {
    dfn[u]=low[u]=++cnt;
    stk.push_back(u); ins[u]=true;
    for(int i=0; i<adj[u].size(); i++) {
        int v=adj[u][i];
        if(!dfn[v]) {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        } else if(ins[v]) {
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(dfn[u]==low[u]) {
        nr++;
        con.clear();
        while(stk.back()!=u) {
            int v=stk.back();
            stk.pop_back();
            con.push_back(v);
            ins[v]=false;
        }
        int v=stk.back();
        stk.pop_back();
        con.push_back(v);
        sol.push_back(con);
        ins[v]=false;
    }
}

int main() {
    fin>>n>>m;
    for(int i=0; i<m; i++) {
        int u,v;
        fin>>u>>v;
        adj[u].push_back(v);
    }
    for(int i=1; i<=n; i++) {
        if(!dfn[i]) tarjan(i);
    }
    fout<<sol.size()<<"\n";
    for(int i=0;i<sol.size();i++){
        for(int j=0;j<sol[i].size();j++)
            fout<<sol[i][j]<<" ";
        fout<<"\n";
    }
    return 0;
}