Pagini recente » Cod sursa (job #1693559) | Cod sursa (job #1484090) | Cod sursa (job #1881180) | Cod sursa (job #1868539) | Cod sursa (job #752653)
Cod sursa(job #752653)
# include <stdio.h>
# include <vector>
using namespace std;
vector <int> g[200010],g1[200010],vt[200010];
int i,x,n,y,nc,m,timp,st[200010],p,nr;
bool sel[200010];
void dfs(int x)
{
sel[x]=true;
for (vector <int> :: iterator it=g[x].begin(); it!=g[x].end(); it++)
if (sel[*it]==false)
dfs(*it);
st[++p]=x;
}
void dfs1(int x)
{
vt[nr].push_back(x);
sel[x]=true;
for (vector <int> :: iterator it=g1[x].begin(); it!=g1[x].end(); it++)
if (sel[*it]==false)
dfs1(*it);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d %d\n",&n,&m);
for (i=1; i<=m; i++)
{
scanf("%d %d\n",&x,&y);
g[x].push_back(y);
g1[y].push_back(x);
}
timp=0;
for (i=1; i<=n; i++)
if (sel[i]==false)
{
nc++;
dfs(i);
}
for (i=1; i<=n; i++)
sel[i]=false;
for (i=n; i>=1; i--)
if (sel[st[i]]==false)
{
nr++;
dfs1(st[i]);
}
printf("%d\n",nr);
for (i=1; i<=nr; i++)
{
for (vector <int> :: iterator it=vt[i].begin(); it!=vt[i].end(); it++)
printf("%d ",*it);
printf("\n");
}
return 0;
}