Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 190 si 223 | Diferente pentru implica-te/arhiva-educationala intre reviziile 217 si 223 | Diferente pentru implica-te/arhiva-educationala intre reviziile 204 si 223 | Diferente pentru implica-te/arhiva-educationala intre reviziile 215 si 223 | Cod sursa (job #3286545)
///circular
//unordered_
#include <bits/stdc++.h>
#define MOD 1000000007
#define big 1e9
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int i,n,m,f[100010],ft[100010],cn,x,y;
vector <int> v[100010],vt[100010];
stack <int> q;
queue <int> qu[100010];
void idc(int k)
{
f[k]=1;
for(auto it : v[k])
if(f[it]==0)
idc(it);
q.push(k);
}
void idct(int k)
{
ft[k]=cn;
for(auto it : vt[k])
if(ft[it]==0)
idct(it);
}
int main()
{
cin.tie(0);
cout.tie(0);
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>x>>y;
v[x].push_back(y);
vt[y].push_back(x);
}
for(i=1; i<=n; i++)
if(f[i]==0)
idc(i);
while(q.size())
{
if(ft[q.top()]==0)
{
cn++;
idct(q.top());
}
q.pop();
}
fout<<cn<<'\n';
for(i=1; i<=n; i++)
qu[ft[i]].push(i);
for(i=1; i<=n; i++)
{
while(qu[i].size())
{
fout<<qu[i].front()<<" ";
qu[i].pop();
}
fout<<'\n';
}
return 0;
}