Cod sursa(job #1351085)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 21 februarie 2015 10:15:03
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

#define MAXN 100050

using namespace std;

int n, m, marked[MAXN], nm[MAXN], nq;
vector<int> v[MAXN];
vector<int> trV[MAXN];
vector<int> compo[200];

void citire()
{
    int x, y;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        scanf("%d %d", &x, &y);
        v[x].push_back(y);
        trV[y].push_back(x);
    }
}

void dfs(int x)
{
    if (nm[x] || marked[x]) return;
    marked[x] = 1;
    for (int i = 0; i < v[x].size(); i++)
        dfs(v[x][i]);
}

void rdfs(int x)
{
    if (nm[x] || marked[x] >= 5) return;
    marked[x] += 5;
    if (marked[x] == 6)
    {
        compo[nq].push_back(x);
        nm[x] = 1;
    }
    for (int i = 0; i < trV[x].size(); i++)
        rdfs(trV[x][i]);
}

void solve()
{
    for (int i = 1; i <= n; i++)
        if (!nm[i])
        {
            memset(marked, 0, sizeof(marked));
            dfs(i);
            rdfs(i);
            nq++;
        }
}

void afisare()
{
    printf("%d\n", nq);
    for (int i = 0; i < nq; i++)
    {
        for (int j = 0; j < compo[i].size(); j++)
            printf("%d ", compo[i][j]);
        printf("\n");
    }
}

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

    citire();
    solve();
    afisare();
    return 0;
}