Pagini recente » Cod sursa (job #323624) | Cod sursa (job #2150405) | Cod sursa (job #1996773) | Cod sursa (job #1435147) | Cod sursa (job #2211613)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int N=100000;
struct info
{
int a,b,i;
};
int n,m;
vector<int>v[N+5];
vector<int>inv[N+5];
info sol[N+5];
void dfs_v(int nod)
{
for(auto nou:v[nod])
if(sol[nou].a==0)
{
sol[nou].a=sol[nod].a;
dfs_v(nou);
}
}
void dfs_inv(int nod)
{
for(auto nou:inv[nod])
if(sol[nou].b==0)
{
sol[nou].b=sol[nod].b;
dfs_inv(nou);
}
}
bool cmp(info x,info y)
{
if(x.a==y.a)
return x.b<y.b;
return x.a<y.a;
}
int pa=0,pb=0;
int cnt=0;
vector<vector<int>>afis;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
sol[i].i=i;
while(m--)
{
int a,b;
fin>>a>>b;
v[a].push_back(b);
inv[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
if(sol[i].a==0)
{
sol[i].a=++pa;
dfs_v(i);
}
if(sol[i].b==0)
{
sol[i].b=++pb;
dfs_inv(i);
}
}
sort(sol+1,sol+n+1,cmp);
cnt++;
afis.push_back({});
afis[0].push_back({sol[1].i});
for(int i=2;i<=n;i++)
{
if(cmp(sol[i-1],sol[i])==1)
{
cnt++;
afis.push_back({});
}
afis[cnt-1].push_back({sol[i].i});
}
fout<<cnt<<"\n";
for(auto itr:afis)
{
for(auto aux:itr)
{
fout<<aux<<" ";
}
fout<<"\n";
}
return 0;
}