Pagini recente » Cod sursa (job #174060) | Cod sursa (job #2971438) | Cod sursa (job #1253577) | Cod sursa (job #2632193) | Cod sursa (job #2481060)
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 100002
using namespace std;
FILE *f=fopen("ctc.in","rt");
ofstream o("ctc.out");
vector<int> g[Nmax];
vector<int> gt[Nmax];
int i,n,m,x,y,q[Nmax],k,h,sol[Nmax],nrsol,nr[Nmax],d,kcont=1,cont;
bool viz[Nmax];
void dfs1(int x){
viz[x]=true;
int l=g[x].size(),v;
for(int i=0;i<l;++i){
v=g[x][i];
if(!viz[v])
dfs1(v);
}
q[++k]=x;
}
void dfs2(int x){
++d;
sol[++h]=x;
viz[x]=false;
int l=gt[x].size(),v;
for(int i=0;i<l;++i){
v=gt[x][i];
if(viz[v])
dfs2(v);
}
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;++i){
fscanf(f,"%d%d",&x,&y);
g[x].push_back(y);
gt[y].push_back(x);
}
for(i=1;i<=n;++i)
if(!viz[i])
dfs1(i);
for(i=n;i>0;--i)
if(viz[q[i]]){
dfs2(q[i]);
nr[++nrsol]=d;
d=0;
}
// afis
o << nrsol << '\n';
for(i=1;i<=n;++i){
o << sol[i] << " ";
++cont;
if(cont==nr[kcont]){
o << '\n';
++kcont;
cont=0;
}
}
return 0;
}