Cod sursa(job #2664810)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 29 octombrie 2020 15:07:50
Problema Componente tare conexe Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

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

typedef vector<int> vi;
typedef vector<bool> vb;

int n,m,k;
vector<vector<int>> g;
vector<vector<int>> gr;

vi ctc;
int nrctc=0;

void pm(int start){
    if(ctc[start]) return;
    vb plus(n+1,0), minus(n+1,0);
    // vb tc(n+1,0);
    auto dfs=[](int x, vb& viz, vector<vi> &g, auto &dfs1)->void{
        viz[x]=1;
        for(auto nx:g[x]){
            if(viz[nx]==0)
                dfs1(nx, viz, g, dfs1);
        }
    };
    dfs(start, plus, g, dfs);
    dfs(start, minus, gr, dfs);
    cout<<nrctc<<" ";
    ++nrctc;
    for(int i=1;i<=n;++i)
        if(plus[i] and minus[i] and ctc[i]==0){
            ctc[i]=nrctc;
        }
    // for(int i)
}

int main(){
    fin>>n>>m;
    g.resize(n+1);
    gr.resize(n+1);
    ctc.resize(n+1,0);
    for(int i=m;i--;){
        int x,y;
        fin>>x>>y;
        g[x].push_back(y);
        gr[y].push_back(x);
    }
    //
    for(int i=1;i<=n;++i)
        pm(i);
    vector<vi> ans(nrctc+1);
    for(int i=1;i<=n;++i)
        ans[ctc[i]].push_back(i);
    fout<<nrctc<<"\n";
    for(int i=1;i<=nrctc;++i){
        for(auto x:ans[i])
            fout<<x<<" ";
        fout<<"\n";
    }
}