Pagini recente » Cod sursa (job #956971) | Cod sursa (job #2100870) | Cod sursa (job #2273451) | Cod sursa (job #2197640) | Cod sursa (job #2284010)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
const int N=100000+5;
int n,m;
vector<int>g1[N],g2[N];
bool viz[N];
vector<int>ord;
inline void dfs1(int nod)
{
viz[nod]=1;
for(auto &nou:g1[nod])
{
if(viz[nou]==0)
{
dfs1(nou);
}
}
ord.push_back(nod);
}
vector<vector<int>>ans;
inline void dfs2(int nod)
{
viz[nod]=1;
ans.back().push_back(nod);
for(auto &nou:g2[nod])
{
if(viz[nou]==0)
{
dfs2(nou);
}
}
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g1[x].push_back(y);
g2[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(viz[i]==0)
{
dfs1(i);
}
}
for(int i=1;i<=n;i++)
{
viz[i]=0;
}
reverse(ord.begin(),ord.end());
for(auto &nod:ord)
{
if(viz[nod]==0)
{
ans.push_back({});
dfs2(nod);
}
}
cout<<ans.size()<<"\n";
for(auto &i:ans)
{
for(auto &j:i)
{
cout<<j<<" ";
}
cout<<"\n";
}
return 0;
}