Cod sursa(job #1219422)

Utilizator danalex97Dan H Alexandru danalex97 Data 14 august 2014 10:04:21
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

ifstream F("ctc.in");
ofstream G("ctc.out");

const int N = 100010;

int n,nn,m,mark[N];
vector<int> v[N],vt[N],w[N],comp[N],stack;

void dff(int x)
{
    mark[x] = 1;
    for (size_t i=0;i<v[x].size();++i)
    {
        int y = v[x][i];
        if ( mark[y] == 0 )
            dff(y);
    }
    stack.push_back(x);
}

void dfs(int x,int comp)
{
    mark[x] = comp;
    for (size_t i=0;i<vt[x].size();++i)
    {
        int y = vt[x][i];
        if ( mark[y] == 0 )
            dfs(y,comp);
    }
}

void ctc()
{
    for (int i=1;i<=n;++i)
        if ( mark[i] == 0 )
            dff(i);
    memset(mark,0,sizeof(mark));
    for (;!stack.empty();stack.pop_back())
    {
        int x = stack.back();
        if ( mark[x] == 0 )
            dfs(x,++nn);
    }
    for (int i=1;i<=n;++i)
        comp[mark[i]].push_back(i);
    G<<nn<<'\n';
    for (int i=1;i<=nn;++i)
    {
        for (size_t j=0;j<comp[i].size();++j)
            G<<comp[i][j]<<' ';
        G<<'\n';
    }
}

int main()
{
    F>>n>>m;
    for (int i=1,x,y;i<=m;++i)
    {
        F>>x>>y;
        v[x].push_back(y);
        vt[y].push_back(x);
    }
    ctc();
}