Pagini recente » Cod sursa (job #2385864) | Cod sursa (job #1279753) | Istoria paginii runda/simulare_baraj_2009/clasament | Cod sursa (job #2284590) | Cod sursa (job #3252942)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
const int Nmax = 1e5;
vector<vector<int>>g, gt;
bool vis[Nmax];
void dfs(int nod, vector<vector<int>>& graf, vector<int>& addto)
{
vis[nod] = 1;
for(auto it: graf[nod])
if(vis[it] == 0)
dfs(it, graf, addto);
addto.push_back(nod);
}
int main()
{
int n, m, i, a, b;
cin >> n >> m;
g.resize(n + 5);
gt.resize(n + 5);
for(i = 1; i <= m; i ++)
{
cin >> a >> b;
g[a].push_back(b);
gt[b].push_back(a);
}
vector<int> st;
for(i = 1; i <= n; i ++)
if(vis[i] == 0)
dfs(i, g, st);
vector<vector<int>>ctc;
for(i = 0; i <= n; i ++)
vis[i] = 0;
for(i = st.size() - 1; i >= 0; i --)
if(vis[st[i]] == 0)
{
ctc.push_back(vector<int>());
dfs(st[i], gt, ctc.back());
}
cout << ctc.size() << '\n';
for(auto i: ctc)
{
for(auto j: i)
cout << j << " ";
cout << '\n';
}
return 0;
}