Pagini recente » Cod sursa (job #1958962) | Cod sursa (job #1108360) | Cod sursa (job #506316) | Cod sursa (job #2943521) | Cod sursa (job #1662954)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
vector <int> v,a[100001],t[100001];
priority_queue <int, vector<int>,greater<int>> s[100001];
int n,m,i,k,x,y;
bool viz[100001],viz2[100001];
void df1(int p)
{
viz[p]=1;
vector<int>::iterator i;
for(i=a[p].begin();i<a[p].end();i++)
if(!viz[*i])
df1(*i);
v.push_back(p);
}
void df2(int p)
{
viz2[p]=1; s[k].push(p);
vector<int>::iterator i;
for(i=t[p].begin();i<t[p].end();i++)
if(!viz2[*i])
df2(*i);
}
int main()
{
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
a[x].push_back(y);
t[y].push_back(x);
}
vector<int>::iterator j;
// for(i=1;i<=n;i++)
// {
// for(j=a[i].begin();j<a[i].end();j++)
// cout<<*j<<" ";
// cout<<"\n";
// }
for(i=1;i<=n;i++)
if(!viz[i])
df1(i);
for(j=v.end()-1;j>=v.begin();j--)
if(!viz2[*j])
{
k++;
df2(*j);
}
fout<<k<<"\n";
for(i=1;i<=k;i++)
{
while(!s[i].empty())
{
fout<<s[i].top()<<" ";
s[i].pop();
}
fout<<"\n";
}
return 0;
}