Pagini recente » Cod sursa (job #799629) | Cod sursa (job #2646938) | Cod sursa (job #2920038) | Cod sursa (job #2319499) | Cod sursa (job #1020288)
#include <cstdio>
#include <vector>
using namespace std;
int i, x, y, N, M, nr, Sel[100001];
vector<int> G[100001],Gt[100001],Sol[100001],Stiva;
inline void DF(int);
inline void DF2(int);
int main()
{
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i=1; i<=N; i++)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
Gt[y].push_back(x);
}
for (i=1; i<=N; i++)
if (!Sel[i]) DF(i);
for (i=1; i<=N; i++)
Sel[i]=0;
for (i=0; i<Stiva.size(); i++)
if (!Sel[Stiva[i]])
{
nr++;
DF2(Stiva[i]);
}
printf("%d\n", nr);
for (i=1; i<=nr; i++)
{
for (vector<int>::iterator it=Sol[i].begin(); it!=Sol[i].end(); it++)
printf("%d ", *it);
printf("\n");
}
}
inline void DF(int x)
{
Sel[x]=1;
for (vector<int>::iterator it=G[x].begin(); it!=G[x].end(); it++)
if (!Sel[*it]) DF(*it);
Stiva.push_back(x);
}
inline void DF2(int x)
{
Sel[x]=1;
for (vector<int>::iterator it=Gt[x].begin(); it!=Gt[x].end(); it++)
if (!Sel[*it]) DF2(*it);
Sol[nr].push_back(x);
}