Pagini recente » Cod sursa (job #2191235) | Cod sursa (job #2771428) | Cod sursa (job #2694234) | Cod sursa (job #2890827) | Cod sursa (job #2974424)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin ("ctc.in");
ofstream cout ("ctc.out");
vector <int> g[100005];
vector <int> rg[100005];
int v[100005],vf;
int n,m;
int cnt;
int cntcomp;
vector<int> comp[100005];
bool u[100005];
void dfs (int k)
{
u[k] = true;
for (auto vf:g[k])
{
if (u[vf])
continue;
dfs(vf);
}
cnt++;
v[cnt] = k;
}
void dfsr (int k)
{
u[k] = true;
for (auto vf:rg[k])
{
if (u[vf])
continue;
dfsr(vf);
}
comp[cntcomp].push_back(k);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
int i,j;
for (i=1;i<=m;i++)
{
int x,y;
cin >> x >> y;
g[x].push_back(y);
rg[y].push_back(x);
}
for (i=1;i<=n;i++)
if(!u[i])
dfs(i);
for (i=1;i<=n;i++)
u[i] = false;
for (i=cnt;i>=1;i--)
if (!u[v[i]])
{
cntcomp++;
dfsr(v[i]);
}
cout << cntcomp << '\n';
for(i=1;i<=cntcomp;i++)
{
sort(comp[i].begin(),comp[i].end());
for (j=0;j<comp[i].size();j++)
cout << comp[i][j] << ' ';
cout << '\n';
}
return 0;
}