Pagini recente » Cod sursa (job #332270) | Cod sursa (job #930920) | Cod sursa (job #860892) | Cod sursa (job #737445) | Cod sursa (job #1370971)
#include <cstdio>
#include <vector>
#define pb push_back
#define nmax 100010
using namespace std;
bool used[nmax];
vector<int> a[nmax], at[nmax], sol[nmax];
int n, k, m, i, x, y, nrtcnx;
int ant[nmax];
void dfs(int node)
{
vector<int>::iterator it;
used[node]=true;
for(it=a[node].begin(); it!=a[node].end(); ++it)
if(!used[*it]) dfs(*it);
ant[++k]=node;
}
void df(int node)
{
vector<int>::iterator it;
used[node]=false;
sol[nrtcnx].pb(node);
for(it=at[node].begin(); it!=at[node].end(); ++it)
if(used[*it]) df(*it);
}
int main()
{
freopen("ctc.in", "rt", stdin);
freopen("ctc.out", "wt", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=m; ++i)
{
scanf("%d%d", &x, &y);
a[x].pb(y);
at[y].pb(x);
}
for(i=1; i<=n; ++i)
if(!used[i]) dfs(i);
for(i=n; i>=1; --i)
if(used[ant[i]])
{
++nrtcnx;
df(ant[i]);
}
printf("%d\n", nrtcnx);
for(i=1; i<=nrtcnx; ++i)
{
for(vector<int>::iterator it=sol[i].begin(); it!=sol[i].end(); ++it)
printf("%d ", *it);
printf("\n");
}
return 0;
}