Pagini recente » Cod sursa (job #103797) | IAP #5: Open surse | Cod sursa (job #2463714) | Cod sursa (job #296508) | Cod sursa (job #1112842)
#include<cstdio>
#include<vector>
#define pb push_back
#define N_MAX 100010
using namespace std;
vector <int> G[N_MAX];
vector <int> Gt[N_MAX];
bool used[N_MAX];
int N, ST[N_MAX],Nr_Sol;
inline void DF_Trans(int nod,bool afis)
{
if (afis) printf("%d ",nod);
used[nod]=true;
for (vector <int> :: iterator it=Gt[nod].begin();it!=Gt[nod].end();++it)
if (!used[*it]) DF_Trans(*it,afis);
}
inline void DF(int nod)
{
used[nod]=true;
for (vector <int> :: iterator it=G[nod].begin();it!=G[nod].end();++it)
if (!used[*it]) DF(*it);
ST[++ST[0]]=nod;
}
inline void Load_Data(int &N)
{
int M,x,y;
scanf("%d%d",&N,&M);
for (int i=1;i<=M;++i)
{
scanf("%d%d",&x,&y);
G[x].pb(y); Gt[y].pb(x);
}
for (int i=1;i<=N;++i) used[i]=false;
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
Load_Data(N); ST[0]=0;
for (int i=1;i<=N;++i)
if (!used[i]) DF(i);
for (int i=1;i<=N;++i) used[i]=false;
for (int i=N;i>0;--i)
if (!used[ST[i]]) {DF_Trans(ST[i],false); Nr_Sol++;}
for (int i=1;i<=N;++i) used[i]=false;
printf("%d\n",Nr_Sol);
for (int i=N;i>0;--i)
if (!used[ST[i]]) {DF_Trans(ST[i],true); printf("\n");}
fclose(stdin); fclose(stdout);
return 0;
}