Pagini recente » Borderou de evaluare (job #1316604) | Borderou de evaluare (job #2808630) | Borderou de evaluare (job #80589) | Borderou de evaluare (job #2397513) | Cod sursa (job #2206999)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <algorithm>
#define NMAX 100002
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
int n,m;
vector <int> g[NMAX], g_n[NMAX], aux, aux2;
vector<vector<int>> rasp;
bitset <NMAX> viz;
void citire()
{
in >> n >> m;
int x,y;
for(int i = 1; i <= m; ++i)
{
in >> x >> y;
g[x].push_back(y);
g_n[y].push_back(x);
}
}
void dfs1(int nod)
{
viz[nod] = true;
for(auto i: g[nod])
if(not viz[i])
dfs1(i);
aux.push_back(nod);
}
void dfs2(int nod)
{
viz[nod] = true;
aux2.push_back(nod);
for(auto i: g_n[nod])
if(not viz[i])
dfs2(i);
}
void afish()
{
out << rasp.size() << '\n';
for(auto i: rasp)
{
for(auto j: i)
out << j << ' ';
out << '\n';
}
}
int main()
{
citire();
for(int i = 1; i <= n; ++i)
if(not viz[i])
dfs1(i);
viz.reset();
reverse(aux.begin(),aux.end());
for(auto i : aux)
{
if(not viz[i])
{
aux2.clear();
dfs2(i);
rasp.push_back(aux2);
}
}
afish();
return 0;
}