Pagini recente » Cod sursa (job #1049049) | Cod sursa (job #908985) | Cod sursa (job #1866538) | Cod sursa (job #741775) | Cod sursa (job #2171247)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <bitset>
#define N 100005
using namespace std;
int n,nr;
vector <int> G[N];
vector <int> invers[N];
stack <int> S;
bitset <N> viz;
vector <int> de_afisat[N];
void recursiv1(int x)
{
vector <int>::iterator it;
S.push(x);
viz[x] = true;
for(it = G[x].begin(); it != G[x].end(); ++it)
{
if(!viz[*it])
{
recursiv1(*it);
}
}
}
void recursiv2(int x)
{
de_afisat[nr].push_back(x);
vector <int>::iterator it;
viz[x] = true;
for(it = invers[x].begin(); it != invers[x].end(); ++it)
{
if(!viz[*it])
{
recursiv2(*it);
}
}
}
void afisare()
{
printf("%d\n",nr);
vector <int>::iterator it;
for(int i = 0 ; i < nr; ++i)
{
for(it = de_afisat[i].begin(); it != de_afisat[i].end(); ++it)
{
printf("%d ",*it);
}
printf("\n");
}
}
void prelucrare()
{
for(int i = 1 ; i <= n; ++i)
{
if(!viz[i])
{
recursiv1(i);
}
}
viz.reset();
while(!S.empty())
{
int tmp = S.top();
S.pop();
if(!viz[tmp])
{
recursiv2(tmp);
++nr;
}
}
afisare();
}
void citire()
{
int m;
scanf("%d %d\n",&n,&m);
for(int i = 0; i < m; ++i)
{
int a,b;
scanf("%d %d\n",&a,&b);
G[a].push_back(b);
invers[b].push_back(a);
}
prelucrare();
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
citire();
return 0;
}