Pagini recente » Cod sursa (job #2424448) | Cod sursa (job #139784) | Cod sursa (job #1007055) | Cod sursa (job #680870) | Cod sursa (job #1184596)
#include <cstdio>
#include <vector>
using namespace std;
int N,M,i,x,y,cnt;
vector <int> Go[100005],Gi[100005],G[100005],discovered,where;
vector <bool> used;
#define pb push_back
void DFP(int nod)
{
used[nod]=true;
for (vector<int>::iterator it=Go[nod].begin();it!=Go[nod].end();it++)
if (!used[*it]) DFP(*it);
discovered.pb(nod);
}
void DFM(int nod)
{
where[nod]=cnt;
for (vector<int>::iterator it=Gi[nod].begin();it!=Gi[nod].end();it++)
if (where[*it]==-1) DFM(*it);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d %d",&N,&M);
for (i=1;i<=M;i++)
{
scanf("%d %d",&x,&y);
Go[x-1].pb(y-1);
Gi[y-1].pb(x-1);
}
used.resize(N); used.assign(used.size(),false);
for (i=0;i<N;i++) if (!used[i]) DFP(i);
where.resize(N); where.assign(where.size(),-1);
for (;discovered.size();discovered.pop_back())
{
if (where[discovered.back()]==-1)
{
DFM(discovered.back());
++cnt;
}
}
for (i=0;i<N;i++) G[where[i]].pb(i);
printf("%d\n",cnt);
for (i=0;i<cnt;i++,printf("\n"))
for (vector<int>::iterator it=G[i].begin();it!=G[i].end();it++) printf("%d ",*it+1);
return 0;
}