Pagini recente » Cod sursa (job #2755230) | Cod sursa (job #1303510) | Cod sursa (job #3147896) | Cod sursa (job #2200886) | Cod sursa (job #1913598)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> rez[50001];
int lrez = 0;
vector<int> g[50001];
vector<int> t[50001];
vector<int> st;
char viz[50001];
int n, m;
void dfs(int n)
{
if(viz[n] == 0)
viz[n] = 1;
else return;
st.push_back(n);
for(int i = 0; i < g[n].size(); i++)
dfs(g[n][i]);
}
void dfst(int n)
{
if(viz[n] == 1)
viz[n] = 2;
else return;
rez[lrez].push_back(n);
for(int i = 0; i < t[n].size(); i++)
dfst(t[n][i]);
}
void ctc(int n)
{
if(!st.empty())
st.clear();
dfs(n);
for(int i = 0; i < st.size(); i++)
{
if(viz[st[i]] == 1)
{
dfst(st[i]);
lrez++;
}
}
}
int main()
{
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d%d", &n, &m);
int a, b;
while(m--)
{
scanf("%d%d", &a, &b);
a--; b--;
g[a].push_back(b);
t[b].push_back(a);
}
for(int i = 0; i < n; i++)
if(viz[i] == 0)
ctc(i);
printf("%d\n", lrez);
//for(int i = 0; i < lrez; i++)
// sort(rez[i].begin(), rez[i].end());
for(int i = 0; i < lrez; i++)
{
//printf("%d ", rez[i].size());
for(int j = 0; j < rez[i].size(); j++)
printf("%d ", rez[i][j] + 1);
printf("\n");
}
return 0;
}