Cod sursa(job #2189358)

Utilizator UnseenMarksmanDavid Catalin UnseenMarksman Data 28 martie 2018 07:15:16
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#define N 100002

using namespace std;

int n, m;
bool seen[N];
vector<int>A[N], B[N], stk;
vector<vector<int>>ctc;

void dfs(int x)
{
    seen[x]=true;
    for(auto it:A[x])
    {
        if(!seen[it])
        {
            dfs(it);
        }
    }
    stk.push_back(x);
}

void reverse_dfs(int x, vector<int>&comp)
{
    seen[x]=0;
    comp.push_back(x);
    for(auto it:B[x])
    {
        if(seen[it])
        {
            reverse_dfs(it, comp);
        }
    }
}

int main()
{
    freopen("ctc.in", "r", stdin);
    freopen("ctc.out", "w", stdout);

    int x,y;

    scanf("%d%d", &n, &m);
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d", &x, &y);
        A[x].push_back(y);
        B[y].push_back(x);
    }
    for(int i=1; i<=n; i++)
    {
        if(!seen[i])
        {
            dfs(i);
        }
    }
    while(stk.size())
    {
        if(seen[stk.back()])
        {
            vector<int>comp;
            reverse_dfs(stk.back(), comp);
            ctc.push_back(comp);
        }
        stk.pop_back();
    }
    printf("%d\n", ctc.size());
    {
        for(auto it:ctc)
        {
            for(auto it2:it)
            {
                printf("%d ", it2);
            }
            printf("\n");
        }
    }
    return 0;
}