Pagini recente » Cod sursa (job #2978647) | Cod sursa (job #1530077) | Cod sursa (job #791826) | Cod sursa (job #2687646) | Cod sursa (job #1778815)
#include <cstdio>
#include <vector>
#define NMAX 100000
using namespace std;
int n,m,i,nr=0;
vector <int> v,sol[NMAX+5],G[NMAX+5],GT[NMAX+5];
bool ok[NMAX+5];
void dfs(int node)
{
int s,i,x;
ok[node]=1;
s=G[node].size();
for(i=0;i<s;++i)
{
x=G[node][i];
if(!ok[x])
dfs(x);
}
v.push_back(node);
}
void dfst(int node)
{
int s,i,x;
ok[node]=0;
s=GT[node].size();
sol[nr].push_back(node);
for(i=0;i<s;++i)
{
x=GT[node][i];
if(ok[x])
dfst(x);
}
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
GT[b].push_back(a);
}
for(i=1;i<=n;++i)
if(!ok[i])
dfs(i);
while(!v.empty())
{
i=v.back();
v.pop_back();
if(ok[i])
{
++nr;
dfst(i);
}
}
printf("%d\n",nr);
for(i=1;i<=nr;++i)
{
int j,s=sol[i].size();
for(j=0;j<s;++j)
printf("%d ",sol[i][j]);
printf("\n");
}
return 0;
}