Cod sursa(job #977809)

Utilizator gbi250Gabriela Moldovan gbi250 Data 26 iulie 2013 18:02:18
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define SIZE 100005
using namespace std;
vector <int> g[SIZE], gt[SIZE], sol[SIZE];
int n, m, x, y, i, nrc, post_ord[SIZE], ctc;
bool viz[SIZE];

void read()
{
    freopen("ctc.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for(i=1;i<=m;++i)
    {
        scanf("%d %d", &x, &y);
        g[x].push_back(y);
        gt[y].push_back(x);
    }
}


void write()
{
    freopen("ctc.out", "w", stdout);
    printf("%d\n", ctc);
    for(int i=1;i<=ctc;++i)
    {
        for(int j=0;j<sol[i].size();++j)
            printf("%d ", sol[i][j]);
        printf("\n");
    }
}

void DFS(int node)
{
    viz[node]=1;
    for(int i=0;i<g[node].size();++i)
        if(!viz[g[node][i]])
            DFS(g[node][i]);
    post_ord[++nrc]=node;
}

void DFS_T(int node)
{
    viz[node]=0;
    sol[ctc].push_back(node);
    for(i=0;i<gt[node].size();++i)
        if(viz[gt[node][i]])
            DFS_T(gt[node][i]);
}

void solve()
{
    for(int i=1;i<=n;++i)
        if(!viz[i])
            DFS(i);

    for(i=n;i>=1;--i)
        if(viz[post_ord[i]]==1)
        {
            ++ctc;
            DFS_T(post_ord[i]);
        }
}

int main()
{
    read();
    solve();
    write();
    return 0;
}