Pagini recente » Cod sursa (job #1140062) | Cod sursa (job #3183486) | Cod sursa (job #1056902) | Cod sursa (job #51877) | Cod sursa (job #1443665)
//Deresu Roberto - FMI
//Re :)
#include<fstream>
#include<vector>
#include<deque>
#define nx 100007
using namespace std;
int n, m, k, l, viz[nx], ord[nx];
vector<int> v[nx], t[nx], sol[nx];
deque<int> d, q;
ifstream fin ("ctc.in");
ofstream fout ("ctc.out");
void Dfs(int x)
{
viz[x] = 1;
sol[k].push_back(x);
for (vector<int>::iterator it = t[x].begin(); it != t[x].end(); it++)
if(viz[*it] == 0) Dfs(*it);
}
void Dfs1(int x)
{
viz[x] = 1;
for (vector<int>::iterator it = v[x].begin(); it != v[x].end(); it++)
if(viz[*it] == 0) Dfs1(*it);
k++;
ord[k] = x;
}
void Re()
{
for(int i = 1; i <= n; i++)
if(viz[i] == 0) Dfs1(i);
for(int i = 1; i <= n; i++) viz[i] = 0;
k = 0;
for(int i = n; i >= 1; i--)
{
if(viz[ord[i]] == 0)
{
k++;
Dfs(ord[i]);
}
}
}
void Read()
{
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y;
fin >> x >> y;
v[x].push_back(y);
t[y].push_back(x);
}
}
void Print()
{
fout << k << '\n';
for(int i = 1; i <= k; i++)
{
for(vector<int>::iterator it = sol[i].begin(); it != sol[i].end(); it++)
{
fout << *it << " ";
}
fout << '\n';
}
}
int main()
{
Read();
Re();
Print();
return 0;
}