Pagini recente » Cod sursa (job #3181312) | Cod sursa (job #868975) | Cod sursa (job #2276920) | Cod sursa (job #1412517) | Cod sursa (job #1714542)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int MAX = 100005;
using VI = vector<int>;
vector<VI> G, Gt;
vector<VI> rez;
VI x;
int N, M;
bool used[MAX];
int m1[MAX], m2[MAX];
int nrez;
void Read();
void DF1( int i, int nod );
void DF2( int i, int nod );
void Solve();
void Write();
int main()
{
Read();
Solve();
Write();
fin.close();
fout.close();
return 0;
}
void Read()
{
int j, x, y;
fin >> N >> M;
G.resize(N + 1);
Gt.resize(N + 1);
rez.resize(N + 1);
for ( j = 1; j <= M; j++ )
{
fin >> x >> y;
G[x].push_back(y);
Gt[y].push_back(x);
}
}
void DF1( int i, int nod )
{
x.push_back(nod);
used[nod] = 1;
for ( const auto& x : G[nod] )
if ( !used[x] )
{
DF1(i, x);
}
}
void DF2( int i, int nod )
{
m2[nod] = i;
for ( const auto& x : Gt[nod] )
if ( !m2[x] )
{
DF2(i, x);
}
}
void Solve()
{
int i;
nrez = 1;
x.push_back(0);
for ( i = 1; i <= N; i++ )
if ( !used[i] )
DF1(i, i);
for ( const auto& y : x )
cout << y << ' ';
cin.get();
for ( auto& y = x.back(); x.size() > 0; x.pop_back(), y = x.back() )
{
// cout << *it; cin.get();
if ( y == 0 ) continue;
if ( !m2[y] )
{
// cout << *it; cin.get();
DF2(nrez, y);
nrez++;
}
}
for ( i = 1; i <= N; i++ )
rez[m2[i]].push_back(i);
}
void Write()
{
int i;
fout << nrez - 1 << '\n';
for ( i = 1; i < nrez; i++ )
{
for ( const auto& x : rez[i] )
fout << x << ' ';
fout << '\n';
}
}