Pagini recente » Cod sursa (job #1265048) | Cod sursa (job #1494782) | Cod sursa (job #1735396) | Cod sursa (job #1365068) | Cod sursa (job #1686249)
#include <stdio.h>
#include <vector>
#include <cstring>
#define nmax 100010
using namespace std;
int n,m,x,y,nr;
bool fr[nmax];
vector <int> g[nmax],gt[nmax],sol,c[nmax];
void dfs1(int nod)
{
fr[nod]=true;
for (int i=0;i<(int)g[nod].size();i++)
if (!fr[g[nod][i]]) dfs1(g[nod][i]);
sol.push_back(nod);
}
void dfs2(int nod)
{
fr[nod]=true;
for (int i=0;i<(int)gt[nod].size();i++)
if (!fr[gt[nod][i]]) dfs2(gt[nod][i]);
c[nr].push_back(nod);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=m;i++) {
scanf("%d %d",&x,&y); g[x].push_back(y); gt[y].push_back(x);
}
for (int i=1;i<=n;i++)
if (!fr[i]) dfs1(i);
memset(fr,0,sizeof(fr));
for (int i=sol.size()-1;i>=0;i--)
if (!fr[sol[i]]) nr++,dfs2(sol[i]);
printf("%d\n",nr);
for (int i=1;i<=nr;i++,printf("\n"))
for (int j=0;j<(int)c[i].size();j++) printf("%d ",c[i][j]);
return 0;
}