Pagini recente » Cod sursa (job #364127) | Cod sursa (job #1688813) | Cod sursa (job #628895) | Cod sursa (job #2940711) | Cod sursa (job #3144208)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#define pb push_back
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
const int NMAX = 100005;
int n, m, k;
vector<int> g[NMAX], gt[NMAX], ans[NMAX];
bool vzt[NMAX];
stack<int> stk;
void DFS1(int nod) {
vzt[nod] = 1;
for(int i=0; i<g[nod].size(); i++)
if(!vzt[g[nod][i]])
DFS1(g[nod][i]);
stk.push(nod);
}
void DFS2(int nod) {
vzt[nod] = 1;
for(int i=0; i<gt[nod].size(); i++)
if(!vzt[gt[nod][i]]) {
DFS2(gt[nod][i]);
}
ans[k].pb(nod);
}
int main()
{
in >> n >> m;
for(int i=1; i<=m; i++) {
int x, y;
in >> x >> y;
g[x].pb(y);
gt[y].pb(x);
}
for(int i=1; i<=n; i++)
if(!vzt[i]) {
DFS1(i);
}
for(int i=1; i<=n; i++)
vzt[i] = 0;
while(!stk.empty()) {
int top = stk.top();
stk.pop();
if(vzt[top])
continue;
k++;
DFS2(top);
}
out << k << '\n';
for(int i=1; i<=k; i++, out << '\n') {
sort(ans[i].begin(), ans[i].end());
for(int j=0; j<ans[i].size(); j++)
out << ans[i][j] << ' ';
}
return 0;
}