Cod sursa(job #1184596)

Utilizator DenisacheDenis Ehorovici Denisache Data 13 mai 2014 13:39:18
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <vector>
using namespace std;
int N,M,i,x,y,cnt;
vector <int> Go[100005],Gi[100005],G[100005],discovered,where;
vector <bool> used;
#define pb push_back
void DFP(int nod)
{
    used[nod]=true;
    for (vector<int>::iterator it=Go[nod].begin();it!=Go[nod].end();it++)
        if (!used[*it]) DFP(*it);
    discovered.pb(nod);
}
void DFM(int nod)
{
    where[nod]=cnt;
    for (vector<int>::iterator it=Gi[nod].begin();it!=Gi[nod].end();it++)
        if (where[*it]==-1) DFM(*it);
}
int main()
{
    freopen("ctc.in","r",stdin);
    freopen("ctc.out","w",stdout);
    scanf("%d %d",&N,&M);
    for (i=1;i<=M;i++)
    {
        scanf("%d %d",&x,&y);
        Go[x-1].pb(y-1);
        Gi[y-1].pb(x-1);
    }
    used.resize(N); used.assign(used.size(),false);
    for (i=0;i<N;i++) if (!used[i]) DFP(i);
    where.resize(N); where.assign(where.size(),-1);
    for (;discovered.size();discovered.pop_back())
    {
        if (where[discovered.back()]==-1)
        {
            DFM(discovered.back());
            ++cnt;
        }
    }
    for (i=0;i<N;i++) G[where[i]].pb(i);
    printf("%d\n",cnt);
    for (i=0;i<cnt;i++,printf("\n"))
        for (vector<int>::iterator it=G[i].begin();it!=G[i].end();it++) printf("%d ",*it+1);
    return 0;
}