Pagini recente » Cod sursa (job #1459735) | Cod sursa (job #350352) | Cod sursa (job #998498) | Cod sursa (job #470214) | Cod sursa (job #2086877)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
const int nm=100000;
vector<int>v1[nm+5];
int l1[nm+5];
vector<int>v2[nm+5];
int l2[nm+5];
int n,m;
int a,b;
int viz1[nm+5],nr1=0;
int viz2[nm+5],nr2=0;
void dfs1(int nod)
{
viz1[nod]=nr1;
for(int i=0;i<l1[nod];i++)
if(viz1[v1[nod][i]]==0)
dfs1(v1[nod][i]);
}
void dfs2(int nod)
{
viz2[nod]=nr2;
for(int i=0;i<l2[nod];i++)
if(viz2[v2[nod][i]]==0)
dfs2(v2[nod][i]);
}
struct fint
{
int a,b,ind;
};
fint sol[nm+5];
bool cmp(fint x,fint y)
{
if(x.a==y.a)
{
if(x.b==y.b)
return x.ind<y.ind;
return x.b<y.b;
}
return x.a<y.b;
}
int unde=0;
vector<int>cine[nm+5];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
v1[a].push_back(b);
v2[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
l1[i]=v1[i].size();
l2[i]=v2[i].size();
}
for(int i=1;i<=n;i++)
if(viz1[i]==0)
{
nr1++;
dfs1(i);
}
for(int i=1;i<=n;i++)
if(viz2[i]==0)
{
nr2++;
dfs2(i);
}
for(int i=1;i<=n;i++)
{
sol[i].ind=i;
sol[i].a=viz1[i];
sol[i].b=viz2[i];
}
sort(sol+1,sol+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(sol[i].a!=sol[i-1].a or sol[i].b!=sol[i-1].b)
unde++;
cine[unde].push_back(sol[i].ind);
}
cout<<unde<<"\n";
for(int i=1;i<=unde;i++)
{
for(int j=0;j<cine[i].size();j++)
cout<<cine[i][j]<<" ";
cout<<"\n";
}
return 0;
}
/**
**/