Cod sursa(job #2481060)

Utilizator andreighinea1Ghinea Andrei-Robert andreighinea1 Data 26 octombrie 2019 13:23:24
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 100002

using namespace std;

FILE *f=fopen("ctc.in","rt");
ofstream o("ctc.out");

vector<int> g[Nmax];
vector<int> gt[Nmax];

int i,n,m,x,y,q[Nmax],k,h,sol[Nmax],nrsol,nr[Nmax],d,kcont=1,cont;
bool viz[Nmax];

void dfs1(int x){
    viz[x]=true;
    int l=g[x].size(),v;

    for(int i=0;i<l;++i){
        v=g[x][i];
        if(!viz[v])
            dfs1(v);
    }
    q[++k]=x;
}

void dfs2(int x){
    ++d;
    sol[++h]=x;
    viz[x]=false;
    int l=gt[x].size(),v;

    for(int i=0;i<l;++i){
        v=gt[x][i];
        if(viz[v])
            dfs2(v);
    }
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;++i){
        fscanf(f,"%d%d",&x,&y);
        g[x].push_back(y);
        gt[y].push_back(x);
    }

    for(i=1;i<=n;++i)
        if(!viz[i])
            dfs1(i);

    for(i=n;i>0;--i)
        if(viz[q[i]]){
            dfs2(q[i]);
            nr[++nrsol]=d;
            d=0;
        }

    // afis
    o << nrsol << '\n';
    for(i=1;i<=n;++i){
        o << sol[i] << " ";
        ++cont;
        if(cont==nr[kcont]){
            o << '\n';
            ++kcont;
            cont=0;
        }
    }

    return 0;
}