Cod sursa(job #1784545)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 20 octombrie 2016 10:39:31
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <vector>

using namespace std;

struct Nod
{
    vector<int> v;
    vector<int> t;
    int s;
} v[100000];

int f[100000], lf = 0;
vector<vector<int> > r;

void parc(int n)
{
    if(v[n].s == 1 || v[n].s == -1)
        return;
    v[n].s = 1;
    f[lf++] = n;
    for(int i = 0; i < v[n].v.size(); i++)
        parc(v[n].v[i]);
}

void parct(int n)
{
    if(v[n].s == -1 || v[n].s == 0)
        return;
    v[n].s = -1;
    r.back().push_back(n);
    for(int i = 0; i < v[n].t.size(); i++)
        parct(v[n].t[i]);
}

int main()
{
    int n, m, i, a, b, j;
    freopen("ctc.in", "r", stdin);
    freopen("ctc.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
        v[i].s = 0;
    for(i = 0; i < m; i++)
    {
        scanf("%d%d", &a, &b);
        a--; b--;
        v[a].v.push_back(b);
        v[b].t.push_back(a);
    }
    for(j = 0; j < n; j++)
    {
        if(v[j].s != 0)
            continue;
        parc(j);
        for(i = 0; i < lf; i++)
        {
            if(v[i].s == 1)
            {
                r.push_back(vector<int>());
                parct(i);
            }
        }
    }
    printf("%d\n", r.size());
    for(i = 0; i < r.size(); i++)
    {
        for(j = 0; j < r[i].size(); j++)
        {
            printf("%d ", r[i][j] + 1);
        }
        printf("\n");
    }
    return 0;
}